输入:1->2->3->4->5->6->7,k=3
输出:5->6->7->1->2->3->4
思路:
1. k为倒数第3个节点,可以先找到倒数k+1个节点
2. 从k+1处断开,头尾重新相接即可实现旋转
3. 找到倒数k+1节点,可参照(找到链表的倒数第k个节点)
4. 引入两个外部操作指针cur1, cur2,以及2个用来保存尾结点rear1变量。
5. 要注意,返回的头节点,是一个新链表,要重新遍历,不能直接用print_link()(来自链表构造)
代码
def rotateK(head, k):
if head is None:
print("The link is None")
return
cur1 = head
cur2 = head
count = 1
# 找到第k个节点,注意count是从1开始
while count < k:
count += 1
cur2 = cur2.next
# rear1就是倒数第k+1个节点, cur1是倒数第k个节点,cur2就是最后一个节点
rear1 = None
while cur2.next is not None:
rear1 = cur1
cur1 = cur1.next
cur2 = cur2.next
# 断开链表,首尾重新相接
rear1.next = None
cur2.next = head
head = cur1
return head
# 测试
link = LinkedList()
print("==========before===========")
link.add(1)
link.add(2)
link.add(3)
link.add(4)
link.add(5)
link.add(6)
link.print_link()
print("==========after===========")
new_head = rotateK(link.head, 3)
while new_head:
print(new_head.data)
new_head = new_head.next
# 结果
==========before===========
1
2
3
4
5
6
==========after===========
4
5
6
1
2
3