【LeetCode】61. 旋转链表
2024-08-24 23:25:51
61. 旋转链表
知识点:链表;
题目描述
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
输入:head = [0,1,2], k = 4
输出:[2,0,1]
解法一:解析
观察可以发现,右移k个节点其实就是以倒数第k个节点作为头节点,即正数第n-k+1个节点作为头节点;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode rotateRight(ListNode head, int k) {
//向右移动k个节点就是倒数第k个节点作为头节点;即正着数第n-k+1个;
if(k == 0 || head == null) return head;
ListNode cur = head;
int n = 1;
while(cur.next != null){
cur = cur.next;
n++; //获得链表长度;
}
int m = n - k % n; //用来获取正着数节点在哪;
cur.next = head; //闭合成环;
while(m > 0){
cur = cur.next;
m--; //指针停在新链表的尾结点;
}
ListNode newHaed = cur.next;
cur.next = null; //断开环;
return newHaed;
}
}
时间复杂度:O(N);
空间复杂度:O(1);
体会
对于链表的while循环
//1.如果最后我们只是想把链表遍历一遍,不需要最后那个指针;
//cur最后停留在了最后的尾节点null上;
while(cur != null){
...
cur = cur.next;
}
//2.如果我们想遍历一遍链表,而且最后一个指针我们之后还有用的;
//cur最后停留在了最后一个节点上。
while(cur.next != null){
...
cur = cur.next;
...
}
获取链表的长度
//写法1:
int n = 1; //注意n从1开始。
while(cur.next != null){
cur = cur.next;//指针最后在尾节点;
n++;
}
//写法2:不用这种!
int n = 0;
while(cur != null){
cur = cur.next; //指针停在null上;
n++;
}
相关题目
参考链接
最新文章
- 读《乔布斯的NeXT和苹果之间,隔了这两个创业常识》
- [LeetCode] Path Sum II 二叉树路径之和之二
- 第16章 调色板管理器_16.4 一个DIB位图库的实现(1)
- Java 7 Concurrency Cookbook 翻译 第一章 线程管理之六
- Python 时间 日期常见操作
- swift 闭包简写实际参数名$0、$1等理解
- zabbix邮件报警脚本(Python)
- PHP判断远程文件是否存在的几种方法
- 策略模式Strategy——坐什么车回家?
- 常见MD5加密解密值及免费解密网站
- VirtualBox虚拟机网络设置(四种方式)
- 使用nio遍历文件夹
- Mac学习
- JVM-索引
- python框架之Flask(1)-Flask初使用
- centos 6.5 搭建zookeeper集群
- Windows 7上安装配置TensorFlow-GPU运算环境
- WPF设置控件获得焦点FocusManager
- java原生文件打包
- CERC2017 Gambling Guide,最短路变形,期望dp