这是一个单链表,我想撤消它
我在stackoverflow中发现了this,但这对我没有帮助
它返回1而不是[16,5,10,1]
我知道反向链接列表是
让第一个节点指向空值
第二个节点指向第一个节点
第三个节点指向第二个节点
有人可以帮我弄清楚如何在我的代码中反向链接列表吗?
这是我的JS:
class LinkedList {
constructor(value) {
this.head = {
value: value,
next: null
};
this.tail = this.head;
this.length = 1;
}
append(value) {
const newNode = {
value: value,
next: null
}
this.tail.next = newNode;
this.tail = newNode;
this.length++;
return this;
}
prepend(value) {
const newNode = {
value: value,
next: null
}
newNode.next = this.head;
this.head = newNode;
this.length++;
return this;
}
printList() {
const array = [];
let currentNode = this.head;
while (currentNode !== null) {
array.push(currentNode.value)
currentNode = currentNode.next
}
return array;
}
insert(index, value) {
//Check for proper parameters;
if (index >= this.length) {
console.log('yes')
return this.append(value);
}
const newNode = {
value: value,
next: null
}
const leader = this.traverseToIndex(index - 1);
const holdingPointer = leader.next;
leader.next = newNode;
newNode.next = holdingPointer;
this.length++;
return this.printList();
}
traverseToIndex(index) {
//Check parameters
let counter = 0;
let currentNode = this.head;
while (counter !== index) {
currentNode = currentNode.next;
counter++;
}
return currentNode;
}
remove(index) {
// Check Parameters
const leader = this.traverseToIndex(index - 1);
const unwantedNode = leader.next;
leader.next = unwantedNode.next;
this.length--;
return this.printList();
}
reverse() {
let currentNode = this.head;
var previous = null;
while (currentNode) {
// save next or you lose it!!!
var save = currentNode.next;
// reverse pointer
currentNode.next = previous;
// increment previous to current node
previous = currentNode;
// increment node to next node or null at end of list
currentNode = save;
}
return this.printList()
}
}
let myLinkedList = new LinkedList(10);
myLinkedList.append(5)
myLinkedList.append(16)
myLinkedList.prepend(1)
myLinkedList.insert(2, 99)
myLinkedList.remove(2)
myLinkedList.reverse() //should return [16,5,10,1]
答案 0 :(得分:1)
实际上你已经很近了,在循环之后只需重新设置头和尾即可。
while(/*...*/ { /*...*/ }
this.tail = this.head;
this.head = previous;
答案 1 :(得分:0)
function reversesll(sll){
if(!sll.head || !sll.head.next) return sll;
var nodes=[],
current = sll.head;
//storing all the nodes in an array
while(current){
nodes.push(current);
current = current.next;
}
var reversedLL = new LinkedList();
reversedLL.head = nodes.pop();
current = reversedLL.head;
var node = nodes.pop();
//make sure to make next of the newly inserted node to be null
//other wise the last node of your SLL will retain its old next.
while(node){
node.next = null;
current.next = node;
current = current.next;
node = nodes.pop();
}
return reversedLL;
}
//create the LL
var sll = new LinkedList();
sll.push(1);
sll.push(2);
sll.push(3);
sll.push(4);
sll.push(5);
//test it
reversesll(sll);
//{head: {value:5, next:{value: 4, next: {value: 3, next: {value:2, next:{value:1, next: null}}}}}}