No.61 旋转链表【中等】
题目:
给你一个链表的头节点 head,旋转链表,将链表的每个节点向右移动 k 个位置。
分析:【推荐使用该算法】
把链表每个节点向右移动 k 个位置,相当于把倒数 k 个节点形成新链表的前半部分,原来前面的 l - k 个形成新链表的后半部分。那么,l - k - 1 位置(从0计算索引)的节点就是新链表的最后一个节点,其Next就是新头节点。
具体这样做:
求链表求长度 l,并将其形成环
对 k 取模,k = k % l
重新从 head 开始走 l - k - 1 步,找到新链表的尾巴,断开即可。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
// date 2023/10/11
func rotateRight(head *ListNode, k int) *ListNode {
if head == nil || head.Next == nil {
return head
}
pre := head
l := 1
for pre.Next != nil {
l++
pre = pre.Next
}
pre.Next = head
k = k % l
step := l - k - 1
pre = head
for step > 0 {
pre = pre.Next
step -= 1
}
head = pre.Next
pre.Next = nil
return head
}
最后更新于