[LeetCode] 61. Rotate List
2016-07-27 15:20
225 查看
思路:
又是个链表小花式操作, 一共轮两遍链表, 第一次计算出链表总节点个数, 第二遍进行拼接. 第一遍算出个数后要更新k的值, 因为k有可能大于等于节点个数, 为了不做多余动作, 就要这么处理. 然后新建一个虚节点做头, 很常用的技巧了, 一直找找到新链表的尾, 记住此时这个尾的下一个节点就要做新链表的头节点, 记录这个尾巴是为了最后好把它的next置为空. 然后再向下挪动一位, 把新链表的头结点接到虚节点后, 然后再遍历到旧链表尾端, 拿这个尾巴接上旧链表的头, 最后把新尾端的next置空即可.
又是个链表小花式操作, 一共轮两遍链表, 第一次计算出链表总节点个数, 第二遍进行拼接. 第一遍算出个数后要更新k的值, 因为k有可能大于等于节点个数, 为了不做多余动作, 就要这么处理. 然后新建一个虚节点做头, 很常用的技巧了, 一直找找到新链表的尾, 记住此时这个尾的下一个节点就要做新链表的头节点, 记录这个尾巴是为了最后好把它的next置为空. 然后再向下挪动一位, 把新链表的头结点接到虚节点后, 然后再遍历到旧链表尾端, 拿这个尾巴接上旧链表的头, 最后把新尾端的next置空即可.
ListNode* rotateRight(ListNode* head, int k) { if (! head || ! head->next || ! k) return head; // 数个数 int size = 0; ListNode* temp = head; while (temp) { size++; temp = temp->next; } // 重置k if (k >= size) k %= size; if (! k) return head; ListNode dummy(0); ListNode* pDummy = &dummy; temp = head; for (int i = 0; i < size - k - 1; i++) temp = temp->next; // 记录新尾节点 ListNode* tail = temp; temp = temp->next; // 将新头节点接到虚节点后面 pDummy->next = temp; while (temp->next) temp = temp->next; // 将旧头节点接到旧尾节点后面 temp->next = head; // 将新尾节点的next置空 tail->next = NULL; return dummy.next; }
相关文章推荐
- [C/C++]反转链表
- C#实现基于链表的内存记事本实例
- C#模拟链表数据结构的实例解析
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++利用静态成员或类模板构建链表的方法讲解
- C++实现简单的学生管理系统
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- Node.js环境下JavaScript实现单链表与双链表结构
- C#实现的简单链表类实例
- 找出链表倒数第n个节点元素的二个方法
- Java数据结构之简单链表的定义与实现方法示例
- Java模拟有序链表数据结构的示例
- C语言单循环链表的表示与实现实例详解
- C++实现的链表类实例
- PHP小教程之实现链表
- PHP中模拟链表和链表的基本操作示例
- C语言双向链表的表示与实现实例详解
- js链表操作(实例讲解)