💢欢迎来到张胤尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥
文章目录
- 算法每日一练 (5)
- 旋转链表
- 题目描述
- 解题思路
- 解题代码
- `c/c++`
- `golang`
- `lua`
官方站点: 力扣 Leetcode
算法每日一练 (5)
旋转链表
题目地址:旋转链表
题目描述
给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
示例 2:
输入:head = [0,1,2], k = 4
输出:[2,0,1]
提示:
- 链表中节点的数目在范围
[0, 500]
内 -100 <= Node.val <= 100
0 <= k <= 2 * 109
解题思路
- 首先考虑边界条件,由题意可知当出现以下情况时,不需要进行任何处理,直接返回头节点即可:
- 当链表是空时;
- 当链表中只有一个节点时;
- 当旋转次数是0时;
- 另外对于链表的旋转,如果链表形成一个环(循环链表),在适当的位置(节点总数 - 移动的步数
k
)断开,那么断开的位置就是链表的尾节点,新的头节点就是尾节点的下一个节点。 - 首先借助辅助指针变量
t
在循环中计算链表节点的数量cnt
,此时当循环结束后,t
变量的位置来到了链表的尾节点。 - 根据之前的分析,
t->next = head
将尾节点和头节点相连后,形成一条循环链表。 - 接着判断旋转的次数,当经过
k
次旋转后,如果节点的位置没有发生任何变化,则不需要再进行处理,直接返回即可。其中int n = k % cnt;
的n == 0
时,表示位置未发生变化。 - 根据之前分析的结果,利用循环从链表当前头节点开始移动,移动(头节点移动链表节点总数 - 移动的步数
k
)后到达新的尾节点位置。 - 那么新的尾节点的下一个节点就是新的头节点。
- 最后返回头节点即可。
解题代码
c/c++
#include <vector>struct ListNode
{int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}
};class Solution
{
public:ListNode *rotateRight(ListNode *head, int k){if (!head || !head->next || k == 0)return head;int cnt = 1;ListNode *t = head;while (t->next){++cnt;t = t->next;}t->next = head;int n = k % cnt;if (n == 0){t->next = nullptr;return head;}ListNode *nTail = head;int setp = cnt - n - 1;while (setp){nTail = nTail->next;--setp;}head = nTail->next;nTail->next = nullptr;return head;}
};
golang
package maintype ListNode struct {Val intNext *ListNode
}func rotateRight(head *ListNode, k int) *ListNode {if head == nil || head.Next == nil || k == 0 {return head}cnt := 1t := headfor t.Next != nil {cnt++t = t.Next}t.Next = headn := k % cntif n == 0 {t.Next = nilreturn head}setp := cnt - n - 1nTail := headfor setp != 0 {nTail = nTail.Nextsetp--}head = nTail.NextnTail.Next = nilreturn head
}
lua
local ListNode = {}function ListNode:new(val, next)local obj = {}setmetatable(obj, self)self.__index = selfobj.Val = val or 0obj.Next = next or nilreturn obj
endlocal function rotateRight(head, k)if head == nil or head.Next == nil or k == 0 thenreturn headendlocal cnt = 1local t = headwhile t.Next ~= nil docnt = cnt + 1t = t.Nextendt.Next = headlocal n = k % cntif n == 0 thent.Next = nilreturn headendlocal nTail = headlocal setp = cnt - n - 1while setp ~= 0 donTail = nTail.Nextsetp = setp - 1endhead = nTail.NextnTail.Next = nilreturn head
end
🌺🌺🌺撒花!
如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。