给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
思路:
链表的交换.这个题目有难度
思路就是 把大问题换成小问题解决,这里刚开始新建了一个节点,这样便于实现后续的操作,并且也容易得到最后的head节点.
这里当满足k个的时候就需要调用一个反转链表的函数,注意在主函数里面,一定要把end.next最后赋值为null,不然会让reverse函数进行无限的循环.
用到了 pre,end,start,next.临时变量.
pre表示的是要进行反转链表的前一个节点,反转完成后记得把pre.next=start,因为此时start指向的节点由原来的头节点变成了 尾节点.
把start.next=next,因为start变成了尾节点,所以我们需要进行连接后面的节点,来保证链表是连续的.
最后把pre和end都赋成start,重新开始下一轮.
/**
* 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 h=new ListNode();
ListNode pre=h;
ListNode end=h;
h.next=head;
while(end!=null){
for(int i=0;i<k&&end!=null;i++){
end=end.next;
}
if(end==null)
break;
ListNode start=pre.next;
ListNode next=end.next;
//记得把end.next 赋值为null
end.next=null;
pre.next=reverse(start);
start.next=next;
pre=start;
end=start;
}
return h.next;
}
public ListNode reverse(ListNode head){
ListNode cur=head;
while(head.next!=null){
ListNode next=head.next.next;
head.next.next=cur;
cur=head.next;
head.next=next;
}
return cur;
}
}