本题是稍有难度的链表题。
能想出这种方法的是真大佬,太巧妙了
1.思路
1)计算链表长度
2)计算新链表起始节点
解题步骤
1)边界检查——k=0或者空链表
2)辅助节点p
3)计算链表长度
4)链表成环
5)计算step,确定新的头节点
6)辅助头节点指向新的头节点
7)打开成环的链
p先在头部,再到尾部,再连成环指向头部,再指向旋转后的头部(p本身位置在链表的尾部,p.next是新头部)。
精妙之处在于:
1)先求出len的同时将链成环;
2)然后求step确定头节点;
3)然后打开成环的链。
4)p永远是前一个,除了列表的前进,一般用p.next去被赋值
2.代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def rotateRight(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
if k == 0 or head == None: #考虑特殊情况,k=0或者空链表
return head
len = 0
dummy = ListNode(0) #创建辅助头节点(哑节点)
dummy.next = head
p = dummy #辅助节点p
while p.next: #计算链表长度
len += 1
p = p.next
p.next = dummy.next #将链表成环
step = len - k % len #确定新头节点,重点在于计算出step
for i in range(step):
p = p.next
dummy.next = p.next #辅助头节点(哑节点)指向新的头节点
p.next = None #p打开已经成环的链
return dummy.next