一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情。
leetcode刷题61旋转链表
前文
本题目为leetcode链表处理类型题目,主要考察对于链表结构的处理,题目序号为61,题目链接为https://leetcode-cn.com/problems/rotate-list/。
题目信息
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2 输出:[4,5,1,2,3]
解题思路
根据题目信息,已知我们有一个链表。而根据要求,我们的目标则是将链表左侧的若干个节点转移到链表的末尾处。根据该要求,很容易想到我们需要从链表头部开始遍历,并记录到达目标节点的位置。将目标节点的位置下一节点设置为空,再将末尾节点的下一节点设置为当前的头节点。而本题目中进行了一定的代码方式优化,首先要将链表的头尾节点相连。这样记录一下链表的总长度。然后从原始的头节点开始进行链表的遍历操作,直至到达目标数量的节点时,我们设置该节点的下一节点为空,也就是将环形链表又重新展开。按照这种方式,也就是相当于题目中要求的,将链表的左侧若干个节点转移到链表的末尾处。满足题目要求,本题目的解答完毕。
解题代码
public ListNode rotateRight(ListNode head, int k) {
if(head == null || head.next == null || k == 0){
return head;
}
ListNode item = head;
int num = 1;
while(item.next != null){
item = item.next;
num ++;
}
item.next = head;
item = item.next.next;
int pos = num - k % num - 1;
while(pos > 0){
item = item.next;
head = head.next;
pos --;
}
head.next = null;
return item;
}
根据代码的信息,结合前文对思路的讲解,很容易看懂我们首先进行链表总长度的记录。至于为什么需要环形链表,主要是给定的长度可能大于链表的原始长度。经过该操作,计算需要断开链表节点的位置,并在对应位置断开链表即可完成解答。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。