反转链表...我的实现有什么问题?
Reverse a linked list... what is wrong with my implementation?
我在根据下面的实现反转链表时遇到问题。我在这里做的有什么不对或遗漏的吗?
class Node {
constructor(val) {
this.val = val;
this.next = null;
}
}
class SinglyLinkedList {
constructor() {
this.head = null;
this.length = 0;
}
push(val) {
var newNode = new Node(val);
var current = this.head;
if (!this.head)
this.head = newNode;
else {
// iterate to the end of the
// list
while (current.next) {
current = current.next;
}
// add node
current.next = newNode;
}
this.length++;
return this;
}
// reverse the list
reverse() {
var prev = null;
var curr = this.head;
while (curr !== null) {
var temp = curr.next;
curr.next = prev;
prev = curr;
curr = temp;
}
return this;
}
print() {
var arr = []
var current = this.head;
while(current) {
arr.push(current.val);
current = current.next;
}
console.log(arr);
}
}
这是我创建对象并推送一些节点时的实现
var list = new SinglyLinkedList();
list.push(1);
list.push(2);
list.push(3);
list.push(4);
每次我 运行 list.reverse()
然后 list.print()
它只打印 [1]
而不是 [4,3,2,1]
.
您尚未更新 reverse
方法中的 head
属性。只需在 while
循环之后添加 this.head = prev;
,我相信它应该可以工作。
您正确地反转了节点之间的链接,但您从未更改 this.head
指向的内容,因此它现在指向列表的末尾而不是列表的前面。所以当你调用print时,print会从最后一个节点开始,然后无处可去。
reverse() {
var prev = null;
var curr = this.head;
while (curr !== null) {
var temp = curr.next;
curr.next = prev;
prev = curr;
curr = temp;
}
this.head = prev; // <--- added
return this;
}
我在根据下面的实现反转链表时遇到问题。我在这里做的有什么不对或遗漏的吗?
class Node {
constructor(val) {
this.val = val;
this.next = null;
}
}
class SinglyLinkedList {
constructor() {
this.head = null;
this.length = 0;
}
push(val) {
var newNode = new Node(val);
var current = this.head;
if (!this.head)
this.head = newNode;
else {
// iterate to the end of the
// list
while (current.next) {
current = current.next;
}
// add node
current.next = newNode;
}
this.length++;
return this;
}
// reverse the list
reverse() {
var prev = null;
var curr = this.head;
while (curr !== null) {
var temp = curr.next;
curr.next = prev;
prev = curr;
curr = temp;
}
return this;
}
print() {
var arr = []
var current = this.head;
while(current) {
arr.push(current.val);
current = current.next;
}
console.log(arr);
}
}
这是我创建对象并推送一些节点时的实现
var list = new SinglyLinkedList();
list.push(1);
list.push(2);
list.push(3);
list.push(4);
每次我 运行 list.reverse()
然后 list.print()
它只打印 [1]
而不是 [4,3,2,1]
.
您尚未更新 reverse
方法中的 head
属性。只需在 while
循环之后添加 this.head = prev;
,我相信它应该可以工作。
您正确地反转了节点之间的链接,但您从未更改 this.head
指向的内容,因此它现在指向列表的末尾而不是列表的前面。所以当你调用print时,print会从最后一个节点开始,然后无处可去。
reverse() {
var prev = null;
var curr = this.head;
while (curr !== null) {
var temp = curr.next;
curr.next = prev;
prev = curr;
curr = temp;
}
this.head = prev; // <--- added
return this;
}