Rotate List
2016-05-27 10:54
411 查看
Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.
思路:题目要求旋转一个链表,向右移动的步数为指定的k。
(1)使用两个指针,一个指向开始的位置,一个指向开始位置的后面的第k个位置,然后开始遍历链表,当后面的那个指针指向最后一个节点的时候,前面的那个指针指向倒数第k个节点的之前的那个节点。而后修改对应的指针的位置就可以了。
(2)注意处理k的问题,k可能比数组的长度比链表的长度要长。
方法一:使用两个指针
/**
* 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||head->next==NULL||k<=0) //一个元素的时候怎么移动都没有区别
return head;
ListNode *res=new ListNode(0);
res->next=head;
ListNode *slow=head,*fast=head;
int len=0;
while(slow)
{
slow=slow->next;
len++;
}
k%=len;
slow=head;
for(int i=0;i<k&&fast;i++)
fast=fast->next;
if(k==0||fast==NULL)
return head;
while(fast->next) //
{
slow=slow->next;
fast=fast->next;
}
//deal
res->next=slow->next;
slow->next=NULL;
fast->next=head;
return res->next;
}
};
方法二:使用一个指针也可以,就是在第一遍求得链表长度结束之后,将链表的最后一个节点的指针指向起始的位置,这样真个链表就变成一个循环链表。在第一遍遍历结束之后,求得长度为len,然后再接着走 len-k%len步就可以找到倒数第k个节点之前的节点。然后做断开 重连的处理就可以了
/**
* 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||head->next==NULL||k<1)
return head;
ListNode *p=head;
int len=1;
while(p->next)
{
++len;
p=p->next;
}
p->next=head;//将链表首尾相连
k=len-k%len;
while(k>0)
{
p=p->next;
--k;
}
head=p->next;
p->next=NULL;
return head;
}
};
For example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.
思路:题目要求旋转一个链表,向右移动的步数为指定的k。
(1)使用两个指针,一个指向开始的位置,一个指向开始位置的后面的第k个位置,然后开始遍历链表,当后面的那个指针指向最后一个节点的时候,前面的那个指针指向倒数第k个节点的之前的那个节点。而后修改对应的指针的位置就可以了。
(2)注意处理k的问题,k可能比数组的长度比链表的长度要长。
方法一:使用两个指针
/**
* 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||head->next==NULL||k<=0) //一个元素的时候怎么移动都没有区别
return head;
ListNode *res=new ListNode(0);
res->next=head;
ListNode *slow=head,*fast=head;
int len=0;
while(slow)
{
slow=slow->next;
len++;
}
k%=len;
slow=head;
for(int i=0;i<k&&fast;i++)
fast=fast->next;
if(k==0||fast==NULL)
return head;
while(fast->next) //
{
slow=slow->next;
fast=fast->next;
}
//deal
res->next=slow->next;
slow->next=NULL;
fast->next=head;
return res->next;
}
};
方法二:使用一个指针也可以,就是在第一遍求得链表长度结束之后,将链表的最后一个节点的指针指向起始的位置,这样真个链表就变成一个循环链表。在第一遍遍历结束之后,求得长度为len,然后再接着走 len-k%len步就可以找到倒数第k个节点之前的节点。然后做断开 重连的处理就可以了
/**
* 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||head->next==NULL||k<1)
return head;
ListNode *p=head;
int len=1;
while(p->next)
{
++len;
p=p->next;
}
p->next=head;//将链表首尾相连
k=len-k%len;
while(k>0)
{
p=p->next;
--k;
}
head=p->next;
p->next=NULL;
return head;
}
};
相关文章推荐
- 查询EBS低效程序
- 金融支付名词解释
- python *args and **kwargs
- sqlplus工具基本使用
- MySQL数据库远程访问权限如何打开(两种方法)
- 【HR必看】Excel中对身份证号码的处理技巧
- tomcat 生成控制台日记到指定文件
- UIViewController的基本概念与生命周期
- java实现堆排序
- Android SystemUI源码分析(一)
- 档口主动工作
- Windows node.js npm install express -g Cannot find module 'express'
- QT设计UI:QT模式对话框打开文件
- PHP TP模板下的微信登录(PC)
- SpiderMonkey--VM栈设计
- C# 对数据库操作的函数总结
- 责任链设计模式(过滤器/拦截器)
- shell 脚本中常用的列表
- 主成分分析(Principal components analysis)-最大方差解释
- gradle 签名配置