206. 反转链表

99 阅读1分钟

题目描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

分析

输入:链表 head 输出:反转后的链表 head

解题方法

如果有长度为 4 的链表(1 ➡️ 2 ➡️ 3 ➡️ 4)

image.png

其实所谓反转的过程,就是把 2 的 next 指向 1,把 3 的 next 指向 2,把 4 的 next 指向 3.

我们看图:

我们借助 dummyHead 去作为反转后链表的头节点,返回结果的时候直接 return dummyHead.next,所以 dummyHead.next 最终会指向 4,这也符合我们上述操作的流程。

先把1拿过来,放到 dummyHead 后边,这个过程需要改变 dummyHead.next 以及 head.next

image.png

这里要注意,在链表操作的过程中,最重要的是保证指针不要丢失,所以在改变 next 的时候,我们要注意思考是不是需要一个变量去存储 next 的指向。

这里我们需要存储 dummyHead.next head.next,就可以保证指针不被丢失。

第一步之后,我们把 head 移动到下一个,也就是 2

再次操作后得到

image.png

所有节点遍历一遍,我们就可以得到结果了~

代码

   /**
       * Definition for singly-linked list.
       * function ListNode(val, next) {
       *     this.val = (val===undefined ? 0 : val)
       *     this.next = (next===undefined ? null : next)
       * }
       */
      /**
       * @param {ListNode} head
       * @return {ListNode}
       */
      var reverseList = function(head) {
          const dummyHead = new ListNode(null)

          while (head) {
            const tmp = dummyHead.next
            const tmp2 = head.next

            dummyHead.next = head
            head.next = tmp

            head = tmp2
          }

          return dummyHead.next

      };

复杂度

时间:O(N), 所有节点遍历一遍 空间:O(1), 三个额外的指针,指向 dummyHeaddummyHead.next, head.next