链表指针 |这是什么意思:接下来是引用,可以被视为链接或指针?



我的问题是关于链表和指针我知道的链表列表及其工作原理,但我的问题是:

我有这个示例奇偶链表:

// 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]

问题是:循环后的oddeven等于:

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]

为什么oddVaR对head的影响,evenVaR对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]。

最新更新