lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1. 题目

这道题的考察点是:

  • 链表的基本操作,如遍历,插入,删除等。
  • 链表的反转技巧,如头插法,递归法等。
  • 边界条件的处理,如空链表,k 为 1,k 大于链表长度等

 

2. 解法

 

思路

这段代码的思路是:

  • 使用一个虚拟节点 dummy 来简化代码,让它指向头节点。
  • 使用三个指针 prev,curr 和 next 来遍历链表,其中 prev 指向当前反转的组的前一个节点,curr 指向当前反转的组的第一个节点,next 指向当前反转的组的下一个节点。
  • 首先计算链表的长度 len,然后根据 len 和 k 判断是否需要反转当前的组。
  • 如果需要反转,就使用头插法将 curr 和 next 之间的节点插入到 prev 和 curr 之间,重复 k - 1 次。
  • 然后将 prev 和 curr 移动到下一组的位置,更新 len。
  • 最后返回 dummy.next 作为新的头节点。

 

代码逻辑

具体实现

public class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        // base case
        if (head == null || k == 1) return head;
        
        // dummy node to simplify the code
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        
        // pointers
        ListNode prev = dummy;
        ListNode curr = head;
        ListNode next = null;
        
        // count the length of the list
        int len = 0;
        while (curr != null) {
            len++;
            curr = curr.next;
        }
        
        // reset curr to head
        curr = head;
        
        // loop through the list and reverse every k nodes
        while (len >= k) {
            // reverse k nodes
            for (int i = 1; i < k; i++) {
                next = curr.next;
                curr.next = next.next;
                next.next = prev.next;
                prev.next = next;
            }
            
            // move prev and curr to the next group
            prev = curr;
            curr = curr.next;
            
            // update len
            len -= k;
        }
        
        // return the new head
        return dummy.next;
    }
}

  

3. 总结

posted on 2023-04-18 16:37  白露~  阅读(2)  评论(0编辑  收藏  举报