Rotate List
2015-06-10 21:24
381 查看
Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given
return
这里的k可能是比链表长度要大的数字,因此实际旋转的位置就是k%len(list)。如果这个计算结果等于零或者等于len(list),列表是不用旋转的。
接下来如果是事例给出的正常情况,那么有三步就能完成旋转。
(1)第一个辅助指针从头开始后移k个位置。
(2)这时第二个辅助指针指向头指针,然后两个指针同时向后移动,直到第一个辅助指针指向尾节点。
(3)声明第三个辅助指针指向第二个辅助指针的后继结点作为将要返回的新头指针。把第二个指针的后继设为空指针,同时将第一个指针的后继指向原先的有指针。这儿样就能完成指针的旋转。
这里从网上看到一个最简洁的方法,直接把尾指针指向头,构成一个循环链表,这样,循环链表直接移K位就行了。
需要注意的是,最后的尾节点要赋值为NULL,需要特别注意的是循环链表向后移位的步数不是K,而是len-k%len(为什么???答:注意审题啊,题目说的是右K位,
所以从左要移动len-k%len位)。
python版本
For example:
Given
1->2->3->4->5->NULLand k =
2,
return
4->5->1->2->3->NULL.
这里的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
相关文章推荐
- java学习第一阶段3
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- maven入门(二)
- Leetcode[147]-Insertion Sort List
- 扫盲项目经理
- 安卓消息处理机制-处理线程
- CF 546B Soldier and Badges
- LSH算法原理
- 黑马程序员----字符串
- 一个关于PCA的疑问
- java
- WebService中使用枚举类型
- Building MFC application with /MD[d] (CRT dll version)requires MFC shared dll version~~~~
- ORACLE单字符函数的函数
- 移动互联网对传统软件公司的冲击
- UIViewController中的viewDidLoad实现和调用
- 决策树之ID3算法
- mac平台下面nodejs环境搭配
- do{...}while(0)的作用
- sendmai和dovecot的简单邮件服务器