题目:61. 旋转链表
链接:https://leetcode-cn.com/problems/rotate-list/
给定一个链表,将每个节点向右平移k个位置(k非负,尾节点补到开始位置),输出旋转后的链表。
示例 1:
输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:
输入: 0->1->2->NULL, k = 4 输出:2->0->1->NULL
解释: 向右旋转 1 步: 2->0->1->NULL 向右旋转 2 步: 1->2->0->NULL 向右旋转 3 步:0->1->2->NULL
向右旋转 4 步:2->0->1->NULL
首先考虑特殊情况:当链表为空或者只有一个节点时,直接返回。
普通情况下怎么优化?当k大于链表长度ListLen时,只需平移k%ListLen即可。
如何实现?指定一个遍历指针,当遍历到ListLen-k的位置时,断开链表,后半部分补到开头就好了,O(n)复杂度。
Python代码:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def rotateRight(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
if not head:
return head
if not head.next:
return head
ListLen = 0
ListHead = head
ListTail = None
ListPrePtr=head
ListPtr=head
while head:
if head.next==None:
ListTail=head
ListLen += 1
head = head.next
k = k % ListLen
if k==0:
return ListHead
ListPtr=ListPrePtr.next
i=1
k=ListLen-k
while i<k:
ListPrePtr=ListPrePtr.next
ListPtr=ListPrePtr.next
i+=1
ListPrePtr.next=None
ListTail.next = ListHead
ListHead=ListPtr
return ListHead