この方法の問題公式わずかに異なる説明であり、公式の解釈リストが再度リストの長さを得るためにトラバースされ、リストおよび適切な場所を見つけるために、リンクされたリストが環を形成するために、リストヘッドの端を指すが切断されます。私の方法は、<、もしK(鎖長鎖長、リストの長さを得るために、次に必要、次いで他のkの場合)>適切な位置に別のポインタP2点ながら、リストの長さで、その結果、二重ポインタを使用することです適切な位置へのポインタ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