[LeetCode] 25. K 个一组翻转链表(java实现)

[LeetCode] 25. K 个一组翻转链表(java实现)

  • 1. 题目
  • 2. 读题(需要重点注意的东西)
  • 3. 解法
  • 4. 可能有帮助的前置习题
  • 5. 所用到的数据结构与算法思想
  • 6. 总结

1. 题目

[LeetCode] 25. K 个一组翻转链表(java实现)_第1张图片
[LeetCode] 25. K 个一组翻转链表(java实现)_第2张图片
[LeetCode] 25. K 个一组翻转链表(java实现)_第3张图片

2. 读题(需要重点注意的东西)

思路:
① 剩下的节点是否够k个(遍历一遍)
② 剩下的节点够k个的话,将其中的节点全部翻转

注意:此处翻转有三步: 
1. 翻转k个节点
2. 改变前置指针
3. 改变末尾指针

[LeetCode] 25. K 个一组翻转链表(java实现)_第4张图片

③ 判断剩下的节点,如果满足,则执行第2步,否则直接返回dummy(哨兵)即可

3. 解法

---------------------------------------------------解法---------------------------------------------------

/**
 * 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) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        for(ListNode node = dummy;;){
            // ①
            ListNode cur = node;
            int i = 0;
            while(cur.next != null && i != k){
                i++;
                cur = cur.next;
            }
            // ③
            if(cur.next == null && i != k) break;
            // ②
            else{
                ListNode a = node.next,end = cur.next,b = a.next;
                ListNode first = a;
                while(b != end){
                    ListNode temp = b.next;
                    b.next = a;
                    a = b;
                    b = temp;
                }
                node.next = a;
                first.next = end;
                node = first;
            }
        }
        return dummy.next;
    }
}

4. 可能有帮助的前置习题

  • [LeetCode]206. 反转链表 (java实现)

5. 所用到的数据结构与算法思想

  • 链表

6. 总结

翻转链表的扩展

你可能感兴趣的:(LeetCode深度解析,链表,java,leetcode)