给定一个单链表,设计一个算法实现链表向右旋转 K 个位置。

举例: 给定 1->2->3->4->5->6->NULL, K=3

则     4->5->6->1->2->3->NULL

分析:

1. 这道题目的关键在于找到 尾节点和旋转后新链表的尾节点。 假设是 tail, new->tail.

然后只要进行 tail->next  = head;

head = new_tail->next;

new_tail->next = NULL;

2. 找两个尾节点可以采用 双指针的方法。

注意到 这两个节点 间距是 K,(初始化,tail = new_tail = head;)

STEP 1:tail 从 head 出发,先走 k 步

STEP 2:  new_tail 和 tail 同时往前走, 当 tail 指向尾节点时, new_tail 的位置即所求。

struct ListNode{
int val;
ListNode *next;
ListNode(int x)
:val(x), next(NULL){}
}; int Length(ListNode *head)
{
int len(0);
for(; head; head = head->next, ++ len);
return len;
} ListNode* ReverseKList(ListNode *head, int k)
{
int length = Length(head);
if(length < 2 || k == 0 || k == length)
return head;
if(k < 0) return ReverseKList(head, k + length);
if(k > length) return ReverseKList(head, k % length); assert(k > 0 && k < length);
ListNode *tail(head), *new_tail(head); // tail 先走K步
for(int i=0; i<k; ++i)
tail = tail->next; // 一起走,知道 tail 指向尾节点
while(tail->next){
tail = tail->next;
new_tail = new_tail->next;
} // new_tail 指向旋转后的尾节点
tail->next = head;
head = new_tail->next;
new_tail->next = NULL; return head;
}

链表操作----将单链表向右旋转 K 个位置的更多相关文章

  1. JAVA 链表操作:单链表和双链表

    主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都 ...

  2. Python与数据结构[0] -> 链表/LinkedList[0] -> 单链表与带表头单链表的 Python 实现

    单链表 / Linked List 目录 单链表 带表头单链表 链表是一种基本的线性数据结构,在C语言中,这种数据结构通过指针实现,由于存储空间不要求连续性,因此插入和删除操作将变得十分快速.下面将利 ...

  3. SDUT-2120_数据结构实验之链表五:单链表的拆分

    数据结构实验之链表五:单链表的拆分 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入N个整数顺序建立一个单链表,将该 ...

  4. SDUT-2122_数据结构实验之链表七:单链表中重复元素的删除

    数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 按照数据输入的相反顺序(逆 ...

  5. SDUT OJ 数据结构实验之链表七:单链表中重复元素的删除

    数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...

  6. SDUT OJ 数据结构实验之链表五:单链表的拆分

    数据结构实验之链表五:单链表的拆分 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...

  7. 《程序员代码面试指南》第二章 链表问题 将单链表每K个节点之间逆序

    样例 链表1-2-3-4-5-6-7-8-9-10 K=3 ,结果 3-2-1-6-5-4-9-8-7-10 java代码 /** * @Description:将单链表每K个节点之间逆序 * @Au ...

  8. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...

  9. [程序员代码面试指南]链表问题-将单链表的每k个节点之间逆序

    题目描述 给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点. 题解 内部函数reverse实现链表beg到end的翻转 ...

随机推荐

  1. 周爱民-javascript

    从纯化的语言中了解到语言的本质:并以混杂的语言来创造我们的世界,.   程序=算法+结构,动静之间,不变的是本质   了解语言的本质,而不是试图学会一门语言.   本书从语言特性出发,把动态静态.函数 ...

  2. Matcher类:(转)

    Matcher类:     使用Matcher类,最重要的一个概念必须清楚:组(Group),在正则表达式中 ()定义了一个组,由于一个正则表达式可以包含很多的组,所以下面先说说怎么划分组的, 以及这 ...

  3. 指定socket文件连接mysql

    1.利用ps aux |grep mysql  查看--socket 路径 2.创建软连接.创建文件 3.登录成功

  4. Ubuntu里面的安装命令总结

    本人是新手中的新手,才开始用ubuntu.下面,总结一下安装软件的方法...... 0. 利用apt-get 其实,在ubuntu下安装软件的方法其实灰常简单.就是在终端里面输入: sudo apt- ...

  5. JQuery判断checkbox是否选中-批量

    在html的checkbox里,选中的话会有属性checked="checked". 如果用一个checkbox被选中,alert这个checkbox的属性"checke ...

  6. 二模 (13)day1

    第一题: 题目大意: N个发射站排成一排,求每个发射站左右第一个比它高的发射站. N<=1000000 解题过程: 1.前几天做poj的时候刚好在discuss里看到有一个神奇的东东叫单调栈,正 ...

  7. select2去除搜索框

    $("#type_select").select2({ minimumResultsForSearch: -1 });

  8. 使用ROS节点(五)

    先启动roscore roscore 为了获取节点信息,可以使用rosnode命令 $ rosnode 获取得一个可接受参数清单

  9. linux 安装vpn

    机器环境 centos Linux  wdcp安装脚本和步骤第一步: wget http://www.huzs.net/soft/pptp_onekey/pptpd6.sh sh pptpd6.sh ...

  10. iOS App创建桌面快捷方式

    http://www.cocoachina.com/ios/20150827/13243.html 先mark,暂时用不到