通过迭代翻转指针,首先是当前指针直接指向下一个的下一个指针,然后下一个指针指向头指针(注意是头指针)也就是pre.next,然后pre再指向它。相当于将当前指针与下一个下一个指针。然后看链表的长度是多少count,这样的反转进行count/k次,反转时的指针变换一共会进行k-1次,所以range(1,k)
边界条件有head 为None head.next为None k为1的时候。
class Solution:
def reverseKGroup(self , head , k ):
# write code here
if head==None or head.next==None or k==1:
return head
l=head
cur=head
count=0
res=ListNode(0)
res.next=head
pre=res
nextnode=None
while l!=None:
count+=1
l=l.next
for i in range(count/k):
for j in range(1,k):
nextnode=cur.next
cur.next=nextnode.next
nextnode.next=pre.next#注意nextnode节点折回去应该指向头节点
pre.next=nextnode
pre=cur
cur=cur.next
return res.next使用栈,根据k,将链表放入栈中然后读出就可以反转,进行count/k次,结束后连接正常链表的l节点(后半段)
也可以直接入栈节点,这样不用后面再新建节点。
class Solution:
def reverseKGroup(self , head , k ):
# write code here
if head==None or head.next==None or k==1:
return head
n=head
stack=[]
count=0
result=res=ListNode(0)
while n!=None:
count+=1
n=n.next
l=head
for i in range(count/k):
t=k
while t>0:
stack.append(l.val)
l=l.next
t-=1
while stack:
res.next=ListNode(stack.pop())
res=res.next
res.next=l
return result.next通过递归方法,设计一个递归函数为翻转链表,参数为翻转部分的头和尾,然后通过k定位循环,来找到要反转部分的尾,翻转函数通过挪指针,然后将剩下的部分再进行k个一组的翻转,再将两个部分连接起来。当剩余部分不足k个的时候,直接返回head即不进行翻转。
class Solution:
def reverseKGroup(self , head , k ):
# write code here
def reverse(start,end):
nextnode=pre=None
cur=start
while cur!=end:
nextnode=cur.next
cur.next=pre
pre=cur
cur=nextnode
return pre
if head==None or head.next==None:
return head
tail=head
i=0
while i<k and tail!=None:
tail=tail.next
i+=1
if i==k:
reverse_result=reverse(head,tail)
else:
return head
other_result=self.reverseKGroup(tail, k)
head.next=other_result
return reverse_result
京公网安备 11010502036488号