算法:反转链表

88 阅读2分钟

这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

背景

学习前端三个月了,准备刷刷面试题,总结总结,一天几道面试题,向大厂进军。

问题

反转链表

定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

示例:

输入:1=>2=>3=>4=>5=>null 输出:5=>4=>3=>2=>1=>null

解析思路:

image.png

我们遍历列表的时候,将当前节点的next指针指向上一个节点。就可以实现链表的反转。

那我们怎么在循环遍历的时候,建立next指向关系呢?

  1. 首先我们设置一个全局变量,用来临时存储上一个节点的引用。

  2. 由于我们第一个节点没有上一个节点,所以默认为 NULL,我们要替换当前节点next为上一个节点,但是我们指针要往下走,所以,先要临时保存当前节点的next(也就是下一个节点的引用)。然后再替换当前节点的next为下一个节点。

  3. 替换完节点以后,当前的节点即是下一个节点的上一个节点,所以我们全局变量替换为当前的节点。

  4. 指针向下走,也就是执行旧的next.

  5. 然后继续循环遍历下一个节点。

代码实现:


      Definition for singly-linked list.
      function ListNode(val) {
          this.val = val;
          this.next = null;
      }
     
    /**
     * @param {ListNode} head
     * @return {ListNode}
     */
    var reverseList = function(head) {
        //默认上一节点为空
        let pre=null;
        //当前的节点
        let cur=head;
        while(cur){
          //由于要覆盖原来下一个节点,所以先获取下一个节点保存。
          var next = cur.next;
           //替换原来的next为上一个pre
           cur.next=pre;
           //保存pre为当前节点,供下一次循环的节点使用。
           pre=cur;
           //指针向前移动
           cur=next;
        }
        return pre;
    };

验证结果:

image.png

结语

一步一步慢慢来,踏踏实实把活干!