我的问题是关于链表和指针我知道的链表列表及其工作原理,但我的问题是:
我有这个示例奇偶链表:
// This is class node for create nodes
class Node {
constructor(val, next) {
this.val = val === undefined ? 0 : val;
this.next = next === undefined ? null : next;
}
}
// this is our function to return odd nodes followed bt even nodes
// * return the index of node not the value so if node index is 1 and value is 2
// thats mean odd node not even cuz we don't care about value
// consider that index start from 1 not from 0
const oddEvenLinkedList = function (head) {
if (!head) return head;
var odd = head
var even = head.next
var evenHead = even
while (odd.next) {
odd.next = even.next
odd = odd.next
even.next = odd.next
even = even.next
}
odd.next = evenHead
return head;
};
// create our linked list
// Node takes two params Node(value, next_node)
const head = new Node(1,
new Node(2,
new Node(3,
new Node(4,
new Node(5,
new Node(6,
new Node(7)))))))
console.log(oddEvenLinkedList(head));
结果将是:
head = [1,3,5,2,4,6,7] // odd numbers followed by even nubmers
所以我的问题是: 当我们添加时,这里发生了什么:
var odd = head
var even = head.next
var evenHead = even
我知道现在odd
变量将是:[1,2,3,4,5,6]
同时even
将是:[2,3,4,5,6,7]
问题是:循环后的odd
和even
等于:
odd = [7]
even = null
在最后一行,当我们添加:odd.next = evenHead
这意味着odd
等于odd=[7,1,2,3,4,5,6,7]
但是当我回来时odd
会是这样的:odd=[1,3,5,2,4,6,7]
同时当我返回时head
将等于odd
相同的结果:head=[1,3,5,2,4,6,7]
为什么odd
VaR对head
的影响,even
VaR对evenHead
的影响?
我希望你明白我的意思:
简单总结,如果你不明白上面的解释
let head = [1,2,3,4,5] // linked list 1->2->3...etc
let x = main
let z = main
//for example when change x or z :
x.next = null
//or
z.next = null // or whatever value
// any changes we do in z or x will affect the head, why?
class Node {
constructor(val, next) {
this.val = val === undefined ? 0 : val;
this.next = next === undefined ? null : next;
}
}
var oddEvenLinkedList = function (head) {
if (!head) return head;
var odd = head
var even = head.next
var evenHead = even
while (odd.next) {
odd.next = even.next
odd = odd.next
even.next = odd.next
even = even.next
}
odd.next = evenHead
return head;
};
const head = new Node(1, new Node(2, new Node(3, new Node(4, new Node(5, new Node(6, new Node(7)))))))
console.log(oddEvenLinkedList(head));
odd.next = evenHead
这意味着odd
将等于odd=[7,1,2,3,4,5,6,7]
但是当我返回odd
时,它是这样的:odd=[1,3,5,2,4,6,7]
原因是循环重新连接了列表。在循环执行之前,从head
开始的列表是:
odd
head
↓
1→2→3→4→5→6→7
↑
evenHead
even
但是循环重定向所有这些"箭头",因此在循环之后,链接如下:
head odd
↓ ↓
1→→→3→→→5→→→7
2→→→4→→→6
↑ ↑
evenHead even
当最后一个任务被执行时,我们得到最终结果:
head odd
↓ ↓
1→→→3→→→5→→→7→→→2→→→4→→→6
↑ ↑
evenHead even
因此,如果您查看odd
,您会发现以下列表序列:[7, 2, 4, 6]。 如果目的是首先获取所有奇数值,然后获取所有偶数值,那么循环后的语句应该从这里更改:
odd.next = evenHead
return head;
对此:
even.next = head
return evenHead;
当状态如下时,它们将被执行(我重复一遍):
head odd
↓ ↓
1→→→3→→→5→→→7
2→→→4→→→6
↑ ↑
evenHead even
但是通过这些最后的陈述,我们得到这个:
head odd
↓ ↓
2→→→4→→→6→→→1→→→3→→→5→→→7
↑ ↑
evenHead even
。然后返回evenHead
,因此序列将是 [2, 4, 6, 1, 3, 5, 7]。