【双指针】25. K 个一组翻转链表

25. K 个一组翻转链表

解题思路

  • 默写反转链表函数
  • 思路:找到k个节点的子链表,并且保存它的下一个节点 方便反转之后的链表连接起来
  • 找到子链表之后,将它的尾节点的next置为null 也就是单独看作一个独立的链表 进行反转
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if(head == null || head.next == null){
            return head;
        }

        // 定义一个哑结点
        ListNode dummyNode = new ListNode(0);
        dummyNode.next = head;

        // 初始化 双指针 
        ListNode pre = dummyNode;
        ListNode end = dummyNode;

        while(end.next != null){
            // 循环k 每次反转都需要找到要反转链表的结尾
            for(int i= 0; i < k && end != null;i++){
                end = end.next;// 每次走K步
            }

            // 判断是不是为null
            if(end == null){
                // 说明要么剩下的节点没有k个 end就为null
                // 也就是不需要执行反转
                break;
            }

            // 保存下一组的链表节点  方便后面连接链表
            ListNode next = end.next;

            // 断开链表 也就是说这道题的思路
            // 就是把分组链表 单独拔出来 成为一个新的小链表 然后
            // 反转链表
            end.next = null;

            // 记录下要反转链表的头节点  pre指向哑结点  pre.next head
            ListNode start = pre.next;

            // 反转链表  将剩余的节点子项
            pre.next = reverse(start);

            // 连接其他链表
            start.next = next;

            // 更新pre 和 end
            pre = start;
            end = start;
        }

        return dummyNode.next;

    }

    // 反转链表 双指针
    public ListNode reverse(ListNode head){
        if(head == null || head.next == null){
            return head;
        }


        ListNode pre = null;
        ListNode cur = head;

        while(cur != null){
            // 保存下一个节点
            ListNode tmp = cur.next;

            cur.next = pre;// 指向前一个节点

            // 移动指针
            pre = cur;
            cur= tmp;
        }

        return pre;
    }
}

你可能感兴趣的:(#,Leetcode,链表,数据结构)