力扣算法学习四

125 阅读1分钟

K 个一组翻转链表

本题主要是一个链表的操作,主要考到链表的反转操作。

    var result = null;//存入最后返回的首地址(第一个位置的指针) 
    //这里要注意:为什么首指针不是head呢
    //比如 1 2 3 4 5 开始的时候首地址是1,比如说k是2 你1和2位置一调换 2就应该是首地址了这时候你要想办法把把这个指针指到第一个位置
    var pre = null;//这里是存上个转换后的尾节点用的
    var cacle = head;//这个是用来存需要反转的链表
    while (head) {
        //这时候你不是所有元素都要一起反转的你要反转k个所有这里你要先找到你要反转的最后一个
        for (var i = 0; i < k - 1; i++) {
            head = head.next;
            if (!head) {
                return result
            }
        }
        var cur = head.next;//找到反转的最后一个地址你要断开所以你要用一个变量把后面的链表存一下不然到后面链表就断了
        head.next = null;
        var [newLink, tail] = reverseLink(cacle)//链表进行反转  反转之后返回两个指针一个是头指针一个是尾指针
        if (!result) {//如果你是第一次反转 你要把首地址的位置存上
            result = newLink;
        }else{//如果不是第一次  你要让上一个的尾节点和现在的头连起来
            pre.next = newLink;
        }
        tail.next = cur;//让这个链表接上后面的数据
        head = tail.next;//让这个链表指向后面的指针
        cacle = tail.next;//让这个链表指向后面的指针 方便下一次进行反转
        pre = tail
    }
    return result
    function reverseLink(head1) {
        var newLink = null;
        var tail = head1
        while (head1) {
            var cur1 = head1.next
            head1.next = newLink;
            newLink = head1;
            head1 = cur1
        }
        return [newLink, tail]
    }
};

要想看懂本题一定要回链表的反转哦!