LeetCode困难题(一)

题目一:

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

方法一:

1、这是一个给定一个反转数链表反转,先实现整个链表反转

2、设置pre=null,curr=head, while(curr!=null) 定义一个新的节点保证当前节点的下一个节点 ListNode temp=curr.next;

3、curr.next=pre将当前节点指针往前指,然后将当前节点赋值给pre,curr=temp,最后返回pre,就是反转后的链表;

4、下面实现多个链表的反转,先设置一个哑结点,ListNode dummy=new ListNode(0);

5、ListNode dummy.next=head,ListNode pre=dummy,end=dummy;

6、开始通过判断end进行循环,while(end!=null) for(int i=0;i<k&&end!=null) end=end.next;

7、如果end==null表示剩下的节点小于阈值k,直接跳出循环break;

8、定义一个next节点存放end的最后指向的位置 ListNode=end.next,在定义一个开始节点ListNode start=pre.next;

9、end.next断开链表,end.next=null;

10、pre.next=reverse(start)实现链表的反转,将start放置到最后;

11、将start指向之前end存放的节点,start.next=next;

12、pre节点和end节点都赋值给start;

13、返回哑结点dummy.next;

具体代码:

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        
        ListNode dummy=new ListNode(0);
        dummy.next=head;
        ListNode pre=dummy;
        ListNode end=dummy;
        
        while(end!=null)
        {
            for(int i=0;i<k&&end!=null;i++) end=end.next;
            if(end==null) break;
            
            ListNode next=end.next;
            ListNode start=pre.next;
            end.next=null;
            pre.next=reverse(start);
            start.next=next;
            pre=start;
            end=start;
        }        
        return dummy.next;        
    }
    
    public ListNode reverse(ListNode head)
    {
        ListNode pre=null;
        ListNode curr=head;
        while(curr!=null)
        {
            ListNode temp=curr.next;
            curr.next=pre;
            pre=curr;
            curr=temp;
        }
        
        return pre;
    }
}

猜你喜欢

转载自www.cnblogs.com/Optimism/p/11360747.html