这篇文章是关于LeetCode如何在k的组中翻转链表的,我觉得边肖很实用,所以分享给大家作为参考。让我们跟着边肖看一看。
00-1010会给你一个链表,每k个节点翻转一次。请返回翻转的链接列表。
k是一个正整数,其值小于或等于链表的长度。
如果节点总数不是k的整数倍,请将最后剩余的节点保持在原始顺序。
00-1010给你这个链表:1-2-3-4-5。
当k=2时,应该返回: 2-1-4-3-5。
当k=3时,应该返回: 3-2-1-4-5。
描述:
您的算法只能使用恒定的额外空间。
不能只改变节点的内部值,需要实际交换节点。
题目描述:
步骤分解:
链表分为要翻转的部分、要翻转的部分和不要翻转的部分。每次翻转前,应确定翻转链表的范围。这是为了确定需要通过k周期记录的已翻转链表的前驱和后继。翻转后方便连接翻转部分和未翻转部分。最初,需要两个变量pre和end。pre表示待翻转链表的前驱,end表示k周期内待翻转链表的结束。当end到达end时,记录下一个next=end.next翻转链表,然后连接三个链表,然后重置pre和end指针,然后进入下一个循环的特例。当翻转部分长度小于K时,定位结束后,end==null已经到达结束,表示话题已经完成,直接返回时间复杂度可以是O(n*K),最好的情况是O(n
空间复杂度为O(1),除了几个必要的节点指针,我们不占用任何其他空间。
示例:
#定义链接列表。
#classListNode(对象):
#def__init__(self,x):
#self.val=x
#自我。下一个=无
类别解决方案(对象):
defreverseKGroup(自我,头部,k):
哑=列表节点(0)
nbsp; p = dummy
while True:
count = k
stack = []
tmp = head
while count and tmp:
stack.append(tmp)
tmp = tmp.next
count -= 1
# 注意,目前tmp所在k+1位置
# 说明剩下的链表不够k个,跳出循环
if count :
p.next = head
break
# 翻转操作
while stack:
p.next = stack.pop()
p = p.next
#与剩下链表连接起来
p.next = tmp
head = tmp
return dummy.next
java实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if (head == null || head.next == null){
return head;
}
//定义一个假的节点。
ListNode dummy=new ListNode(0);
//假节点的next指向head。
// dummy->1->2->3->4->5
dummy.next=head;
//初始化pre和end都指向dummy。pre指每次要翻转的链表的头结点的上一个节点。end指每次要翻转的链表的尾节点
ListNode pre=dummy;
ListNode end=dummy;
while(end.next!=null){
//循环k次,找到需要翻转的链表的结尾,这里每次循环要判断end是否等于空,因为如果为空,end.next会报空指针异常。
//dummy->1->2->3->4->5 若k为2,循环2次,end指向2
for(int i=0;i<k&&end != null;i++){
end=end.next;
}
//如果end==null,即需要翻转的链表的节点数小于k,不执行翻转。
if(end==null){
break;
}
//先记录下end.next,方便后面链接链表
ListNode next=end.next;
//然后断开链表
end.next=null;
//记录下要翻转链表的头节点
ListNode start=pre.next;
//翻转链表,pre.next指向翻转后的链表。1->2 变成2->1。dummy->2->1
pre.next=reverse(start);
//翻转后头节点变到最后。通过.next把断开的链表重新链接。
start.next=next;
//将pre换成下次要翻转的链表的头结点的上一个节点。即start
pre=start;
//翻转结束,将end置为下次要翻转的链表的头结点的上一个节点。即start
end=start;
}
return dummy.next;
}
//链表翻转
// 例子: head:1->2->3->4
public ListNode reverse(ListNode head) {
//单链表为空或只有一个节点,直接返回原单链表
if (head == null || head.next == null){
return head;
}
//前一个节点指针
ListNode preNode = null;
//当前节点指针
ListNode curNode = head;
//下一个节点指针
ListNode nextNode = null;
while (curNode != null){
nextNode = curNode.next;//nextNode 指向下一个节点,保存当前节点后面的链表。
curNode.next=preNode;//将当前节点next域指向前一个节点 null<-1<-2<-3<-4
preNode = curNode;//preNode 指针向后移动。preNode指向当前节点。
curNode = nextNode;//curNode指针向后移动。下一个节点变成当前节点
}
return preNode;
}
}
感谢各位的阅读!关于“LeetCode如何k个一组翻转链表”这篇文章就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/146804.html