【链表】Rotate List(三个指针)
题目:
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个位置,这里旋转一次表示从链表尾部拿一个节点放到链表头部,因此当k等于链表长度的整数倍时,相当于链表又还原到原来的状态。
设链表长度为n,k = k % n, 则题目的意思是相当于把链表的后k个节点放到链表头部,因此我们只需要找到链表的倒数第k个节点,然后让尾节点指向头结点,倒数第k+1个节点的next指向NULL。当然要注意边界条件,例如k刚好是链表长度的整数倍。
对于找到链表的倒数第k个节点,可以用双直针的方法,第一个指针先指向第k个节点,第二个指针指向头结点,然后两个节点一起前进,当第一指针指向尾节点时,第二个指针就指向倒数第k个节点。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
var rotateRight = function(head, k) {
if(head==null||head.next==null||k==0){
return head;
} var r=head,l=head,l_pre=null;
var p=head,len=1;
while(p.next!=null){
p=p.next;
len++;
}
k=k%len;
if(k==0){
return head;
}
for(var i=1;i<k;i++){
r=r.next;
if(r==null){
r=head;
}
} while(r.next){
r=r.next;
l_pre=l;
l=l.next;
} if(l_pre==null){
return head;
}
r.next=head;
l_pre.next=null;
return l; };
【链表】Rotate List(三个指针)的更多相关文章
- PCL智能指针疑云 <三> 智能指针作为函数的传值参数和传引用参数
一 函数的参数传递可以简单分类为“传值”和“传引用”. 声明函数时,形参带引用“&”,则函数调用时,是把实参所在的内存直接传给函数所开辟的栈内存.在函数内对形参的修改相当于对实参也进行修改. ...
- LeetCode 61:旋转链表 Rotate List
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. Given a linked list, rotate the list to the right by k pla ...
- C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)
今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...
- [Swift]LeetCode61. 旋转链表 | Rotate List
Given a linked list, rotate the list to the right by k places, where k is non-negative. Example 1: I ...
- iOS 认识runtime 中的三个指针 isa , IMP , SEL
runtime中函数调用经常被提及的三个概念 isa,IMP,SEL 一 isa:是类指针,之所以说isa是指针是因为Class其实是一个指向objc_class结构体的指针,而isa 是它唯一的私 ...
- 剑指offer—单链表反转的三种实现方法
单链表的反转可以用递归.非递归和栈的方法实现 链表节点定义: struct ListNode{ int val; Node* next; ListNode(int x):val(x),next(nul ...
- C和指针 第三章 指针常量与常量指针
c语言中声明常量的两种方式 const int value int const value 如果要声明常量的指针,即指向常量的指针,则可以参考上面的常量声明修改一下 const int *ptr in ...
- c指针点滴三(指针运算)
#include <stdio.h> #include <stdlib.h> void main3() { ; int *p = # p++;//不可预测的值 ...
- C语言指针(三)指针传递给函数
实例1:传递一个无符号的long型指针给该函数 #include<stdio.h>#include<time.h>void getSeconds(unsignedlong*pa ...
随机推荐
- Java编程模板
package Campus; import java.util.Scanner; public class Main{ public static void main(String args[]){ ...
- day07(Set接口,HashSet类,hashcoad(),Collections工具类,Map集合)
Set接口 set接口的实现类特点 1.无序(取出来的顺序和存进去的数据的顺序不一致) 2.唯一(数据不能存相同的) 底层是用Map集合写的 HashSet类 实现了 set接口 唯一 ...
- 一个用css写出来的下拉菜单
1 <style> 2 /* css*/ 3 #body{ 4 float: left; 5 } 6 #xialakuang{ 7 background-color:#f9f9f9; 8 ...
- 建立多人协作git仓库/git 仓库权限控制(SSH)
转载文章请保留出处 http://blog.csdn.net/defeattroy/article/details/13775499 git仓库是多人协作使用的,可以基于很多种协议,例如http.g ...
- accumarray
Example Create a -by- vector and sum values -D subscripts: val = :; subs = [; ; ; ; ] subs = A = acc ...
- Nonsense Alphabet
Nonsense Alphabet A was an ant Who seldom stood still, And who made a nice house In the side of a hi ...
- MathJax $TeX$ Test Page
MathJax TeX Test Page When $a \ne 0$, there are two solutions to \(ax^2 + bx + c = 0\) and they are ...
- AbpZero之企业微信---登录(拓展第三方auth授权登录)---第三步:需要注意事项
1.AbpZero的auth登录会在数据库中的AbpUserLogins表会根据你登录的ProviderKey和Provider来生成生成一条记录,ProviderKey在表中是唯一的: 2.要登录成 ...
- .Net 百度经纬度转高德
1.需求 由于我们项目里面的经纬坐标是百度的,而对接的第三方需要的是高德的经纬坐标,两者之间是有位差区别的,不能直接使用,我们需要通过一个算法将百度经纬度转化为高德经纬度,在百度官网上,有java算法 ...
- C#八大排序算法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...