反向链接列表...我的实现有问题吗?

问题描述 投票:0回答:2

根据下面的实现,我在反转链表时遇到麻烦。我在这里做错什么吗?

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]

javascript linked-list singly-linked-list
2个回答
2
投票

您正确地反转了节点之间的链接,但是您从未更改this.head所指向的内容,因此它现在指向列表的末尾而不是列表的开头。因此,当您调用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;
  }

0
投票

您尚未在head方法中更新reverse属性。只需在this.head = prev;循环后添加while,我相信它应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.