题目一:
给你一个链表,每 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; } }