JavaScript 反转链表

1,338 阅读1分钟

本篇文章是用JavaScript实现链表的生成以及链表的反转,不足的地方希望大家指出~

  • 在此之前先来看一下链表的定义吧: 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
  • 接下来提出我们的需求:写一个函数 , 输入一个链表 , 反转链表后 , 输出新链表的表头。
明确需求后就开始干啦,具体实现代码如下
  • 创建链表的节点:在js里面可以用构造函数来创建列表的节点
function Node(val){
    this.value = val;
    this.next = null;
  }
  • 首先需要新建链表的方法
function createList(arr) {
      let head = new Node(arr[0]);
      let tail = head;
      for (let i = 1; i <= arr.length - 1; i++) {
        tail.next = new Node(arr[i]);
        tail = tail.next;
      }
      return head;
    }
  • 生成链表
let linkedList = createList([1, 2, 3, 4, 5])

看一下生成的链表结构

  • 反转链表的方法
function reverseList(head) {
      // 1.遍历链表,把链表里面的每个值都拿下来并缓存
      // (在这里我存的节点的值,而不是存整个节点,这样是可以节约内存的)
      let arr = []; //arr用于储存链表的节点的值
      let p = head; //p用于遍历链表
      while (p) {
        arr.push(p.value);
        p = p.next;
      }
      // 2.再次遍历列表,将数组里面的值倒序的赋值给每一个节点的value域就实现了链表的反转
      // (这里我并没有考虑新建一个链表,而是用了原来的链表,可以节约创建新链表的时间和内存)
      p = head;
      while (p) {
        p.value = arr.pop();
        p = p.next;
      }
      return head;
    }
  • 反转链表
let reservesLinkedList = reverseList(list);

反转后链表的结构

以上.