标签:
这里的k可能是比链表长度要大的数字,因此实际旋转的位置就是k%len(list)。如果这个计算结果等于零或者等于len(list),列表是不用旋转的。
接下来如果是事例给出的正常情况,那么有三步就能完成旋转。
(1)第一个辅助指针从头开始后移k个位置。
(2)这时第二个辅助指针指向头指针,然后两个指针同时向后移动,知道第一个辅助指针指向尾节点。
(3)声明第三个辅助指针指向第二个辅助指针的后继结点作为将要返回的新头指针。把第二个指针的后继设为空指针,同时将第一个指针的后继指向原先的有指针。这儿样就能完成指针的旋转。
这里从网上看到一个最简洁的方法,直接把尾指针指向头。构成一个循环链表,这样,循环链表直接以为K位就行了。
需要注意的是,最后的尾节点要赋值为NULL,需要特别注意的是循环链表向后移位的步数不是K,而是len-k%len(为什么???答:注意审题啊,题目说的是右K位,
所以从左要移动len-k%len位)。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* rotateRight(ListNode* head, int k) { if(head==NULL)return NULL; ListNode *p=head; int n=0; while(p->next) { p=p->next; n++; } n++; k=k%n; p->next=head; ListNode *q=head; for(int i=0;i<n-k-1;i++) q=q->next; head=q->next; q->next=NULL; return head; } };
python版本
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # @param {ListNode} head # @param {integer} k # @return {ListNode} def rotateRight(self, head, k): len=0 flag=ListNode(0) flag.next=head while flag.next!=None: flag=flag.next len+=1 if len==0 or k==0: return head k=len-k%len flag.next=head while k>0: flag=flag.next k-=1 head=flag.next flag.next=None return head
标签:
原文地址:http://www.cnblogs.com/qiaozhoulin/p/4567307.html