题目思路翻转[p,q)区间的链表代码
题目题目链接
对给出的链表(无空头结点),每k个结点为一组,将组内结点翻转
若最后剩下不足k个结点,则这部分结点不翻转
返回翻转后的链表表头
使用3个指针p,q,pre
p:指向本次需要翻转的一段链表的第一个结点
q:指向需要翻转的下一段链表第一个结点,即本次需要翻转的一段链表尾结点的下一个结点
pre:指向已翻转的上一段链表尾结点
起始时,初始化一个空的头结点,pre指向该空的头结点,p指向第一个有数据的结点
- q每次从p开始移动k次,直到移动到下一段k个结点的第一个结点,此时[p,q)中结点共k个,翻转该段链表翻转后,令pre.next指向翻转后的这一段链表的头部,使链表不会断开pre移动到已翻转的k个结点的最后一个(即p的位置,p在反转前指向k个结点的第一个,翻转后该节点变为k个结点中最后一个)p移动到下一段k个结点的第一个(即q的位置)
重复以上过程,直到表尾
翻转[p,q)区间的链表用头插法反转(带头结点)链表时,初始时头结点指向null,使得翻转后尾结点也指向null
若要令尾结点指向特定的结点(在本题中即为指向下一段k个结点的第一个),在开始时令头结点先指向该节点即可实现
#反转[start,end)内的结点
def reverseCell(self, start, end):
#创建一个空的头结点,指向end
falseH=ListNode(0)
falseH.next=end
p=start
while p!=end:
q=p.next
p.next=falseH.next
falseH.next=p
p=q
return falseH.next
代码
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def reverseCell(self, start, end):
falseH=ListNode(0)
falseH.next=end
p=start
while p!=end:
q=p.next
p.next=falseH.next
falseH.next=p
p=q
return falseH.next
def reverseKGroup(self, head, k):
if not head:
return None
p=head
pre=ListNode(0)
flag=True
while p:
#遍历链表,每k个反转一次,计数未到k时遍历结束,则不反转
# 设置一个空的头结点,pre初始化指向该头结点
# 用pre保存上一段链表尾,每反转一段链表,pre.next指向反转后的表头,pre移动至反转后的表尾
q=p
counter=1
while q and counter


