力扣面试150题--K 个一组翻转链表
Day 35
题目描述
思路
做法:
- 找最后一个需要反转的元素
- 每个小组内进行反转
- 分为三类点
- 组内的第一个点,使用before记录这个点,用于其后面的节点指向前一个节点。移动到下一个节点。
- 组内不是第一个点也不是最后一个点的其余点,将该节点指向前一个节点,设置该节点为前一个节点,向后移动
- 组内最后一个点,先将这个点指向前一个节点,将这一组前的最后一个节点指向它,将该组的第一个元素下一个指向这个节点的下一个。记录本组最后一个元素以及下一组的第一个元素。
- 循环到最大的元素结束
/*** 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 fakehead = new ListNode();if(k==1){return head;}else{fakehead.next = head;//空头结点ListNode x=head;int i=1;while(x!=null){x=x.next;i++;}int len=i-1;//统计链表长度int max=(len/k)*k;//最后一个需要倒序的元素x=head;i=1;ListNode before=head;//指向前一个节点ListNode beg=fakehead;//指向上一组的最后一个元素while(i<=max){if(i%k==1){//小组中第一个元素before=x;x=x.next;i++;}else if(i%k!=1&&i%k!=0){//到小组中的元素ListNode xia=x.next;x.next=before;before=x;x=xia;i++;}else{//小组中最后一个元素ListNode xia=x.next;x.next=before;ListNode s=beg.next;beg.next=x;s.next=xia;beg=s;x=xia;i++;}}}return fakehead.next; }
}