LCR 024. 反转链表

111 阅读1分钟

其实反转链表,会运用到经典的尾插法。为了防止指针丢失,在前半部分指针(pre)断链的时候,一定要跟踪到后半部分指针(next),也就是说一定要拿一个变量去装后面的指针。可以根据代码画一个动态图。自己画,印象会很深刻。

 * 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) {
    let pre = null
    let cur = head
    while(cur){
        let next = cur.next
        cur.next = pre
        pre = cur
        cur = next
    }
    return pre
};

以上代码就是单链表反转。对于初学者的话,有可能会放在浏览器上去运行,发现跑不起来,这是为什么呢。因为我们并没有构造单链表的结构,对,没错,链表是需要自己构造的。而数组不用自己去构造,new一下就出来了,以下就是一个用类来构造一个链表的结构,入参是一个数组,返回值是一个单链表结构。

     * 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) {
        let pre = null
        let cur = head
        while(cur){
            let next = cur.next
            cur.next = pre
            pre = cur
            cur = next
        }
        return pre
    };

   // 构造一个链表结构
   class ListNode {
        constructor(value) {
            this.value = value;
            this.next = null;
        }
    }

    function arrayToList(array) {
        if (!array || !array.length) {
            return null;
        }
        // 把数组的第一个值转成链表结构并且赋值给head指针
        let head = new ListNode(array[0]);
        // 让current指向head指针
        let current = head;
        // 循环数组来构造链表结构
        for (let i = 1; i < array.length; i++) {
            // 给current结点的next指针存储new ListNode(array[i])的值
            current.next = new ListNode(array[i]);
            // 让current指针指向current的下一个结点
            current = current.next;
        }

        return head;
    }

    // 使用方法
    let array = [1, 2, 3, 4, 5];
    let head = arrayToList(array);
    reverseList(head);

通过以上练习,可以很轻松的实现链表的反转啦。