如何递归地反向链接列表?

时间:2020-06-13 03:31:08

标签: javascript data-structures linked-list reverse singly-linked-list

输入:5-> 9-> 8-> 3-> 1-> 7

预期输出:7-> 1-> 3-> 8-> 9-> 5

问题:

当我显示反向链接列表时,结果为5。这是一个问题,因为它应该是尾巴而不是头部。其余节点在显示孔中都缺失。

问题:

代码库是否存在阻止从头到尾遍历并更改指针以反转列表的问题?

代码:

LinkedList:

class LinkedList {
  constructor() {
    this.head = null;
    this.size = 0;
  }

  insertFirst(item) {
    if (this.head !== null) {
      const newHead = new _Node(item);
      let oldHead = this.head;

      oldHead.prev = newHead;
      newHead.next = oldHead;
      this.head = newHead;
    } else {
      this.head = new _Node(item, this.head);
    }

    this.size++;
  }

  insertLast(item) {
    if (!this.head) {
      this.insertFirst(item);
    } else {
      let tempNode = this.head;
      while (tempNode.next !== null) {
        tempNode = tempNode.next;
      }
      tempNode.next = new _Node(item, null, tempNode);
    }
    this.size++
  }
}

module.exports = LinkedList;

主要:

const LinkedList = require("./LinkedLists");
const { reverse } = require("./Reverse");
const { display } = require("./Supplemental");

function main() {
  let SLL = new LinkedList();

  SLL.insertFirst(5);
  SLL.insertLast(9);
  SLL.insertLast(8);
  SLL.insertLast(3);
  SLL.insertLast(1);
  SLL.insertLast(7);

  reverse(SLL);
  display(SLL);

  return SLL;
}

console.log(main());

反向:

reverse = (SLL) => {
  let curr = SLL.head

  if (!curr) {
    return;
  }

  if (!curr.next) {
    SLL.head = curr;
    return;
  }

  let tmp = reverse(curr.next);
  curr.next.next = curr;
  curr.next = null;
  return tmp;
}


module.exports = { reverse };

显示:

display = (SLL) => {
  let currentNode = SLL.head;

  if (!SLL.head) {
    return null;
  }

  while (currentNode !== null) {
    console.log(currentNode.value);
    currentNode = currentNode.next;
  }

  return;
};

1 个答案:

答案 0 :(得分:0)

有人可以告诉我return tmp在Reverse.js文件中做什么吗?

(1)从Main.js中删除了显示

(2)编辑的Main.js:

const LinkedList = require("./LinkedLists");
const { reverse } = require("./Reverse");
const { display } = require("./Supplemental");

function main() {
  let SLL = new LinkedList();

  SLL.insertFirst(5);
  SLL.insertLast(9);
  SLL.insertLast(8);
  SLL.insertLast(3);
  SLL.insertLast(1);
  SLL.insertLast(7);

  const result = reverse(SLL.head);
  console.log(result);

  return SLL;
}

return main();

(3)编辑的Reverse.js:

reverse = (curr, prev = null) => {
  if (!curr) { 
    return prev;
  }

  let tmp = reverse(curr.next, curr);

  const temp = curr.next;
  curr.next = prev;
  curr.prev = temp;

  return tmp;
}

module.exports = { reverse };