双指针完成反转链表

102 阅读1分钟

题目:

image.png

/**要求输入头节点,但是给了一个数组,返回一个ListNode节点
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(){}

步骤:

1. 将输入的数组转换成链表

 var arrayToLinkedList = function (arr) {
        //1.
        let head = new ListNode(arr[0]);
        //cur是旧链表的最后一个节点(类似头插法)
        let cur = head;
        for (let i = 1; i < arr.length; i++) {
          cur.next = new ListNode(arr[i]);
          cur = cur.next;
        }
        //链表的头节点但相当于返回整个链表
        return head;
      };

解析:

    1. 实例化ListNode()生成头节点
    1. cur就是旧链表的尾节点
    1. 类似头插法,遍历数组后面的数,每一个都转成一个节点,cur.next指向新节点

2. 反转

 var reverseList = function (head) {
        //注意pre为什么初始化null,因为第一个节点反向需要指向null
        let pre = null;
        let cur = head;
        //注意零界点,cur是最后一个元素时最后依次反向,下一个是null,不进行反向,所以while截止
        while (cur) {
          //顺序讲解
          let temp = cur.next;
          cur.next = pre;
          pre = cur;
          cur = temp;
        }
        return pre;
      };

图解:

image.png

进阶:可以使用递归代码量更少

待补充