本题所用方法与官方题解方法略有不同,官方题解是先遍历一遍链表,得到链表长度,再将链表末尾指向链表头形成环,再找到合适位置断开链表。我的方法是利用双指针,在得到链表长度的同时,将另一个指针p2指向合适位置(如果k<链表长度),如果k>链表长度,那么就需要在得到链表长度后,再将另一指针p2指向合适位置。在将p2指针指向合适位置后,进行旋转操作即可。具体旋转操作见代码。
(合适位置:结果链表头在原链表中的前一位)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def rotateRight(self, head: ListNode, k: int) -> ListNode:
# 特殊情况处理
if k == 0:
return head
if head == None:
return head
# 重新添加链表头
hea = ListNode(0)
hea.next = head
# 计算链表长度,同时将p1移动到链表最后一个元素,利用双指针,将p2移动到合适位置(结果链表头的前一位)
l = 0 # 链表长度
p1 = hea
p2 = hea
while p1.next != None:
p1 = p1.next
l += 1
if l > k: # 双指针
p2 = p2.next
# 如果l<=k则p1到达末尾时p2还在原始链表头,所以此时要特殊处理,使p2到达合适位置
if l <= k:
k = k%l
if k == 0:
return head
for i in range(l-k):
p2 = p2.next
# 旋转操作
tmp = p2.next
p2.next = None
p1.next = hea.next
hea.next = tmp
return hea.next