首页 > 其他 > 详细

Leetcode每日一题-61.旋转链表

时间:2021-03-27 12:31:30      阅读:18      评论:0      收藏:0      [点我收藏+]

Leetcode每日一题-61.旋转链表

题解看代码注释

方式一

不借助额外空间,对k取模,移动有限次 核心在于首尾相连+断链

代码

func rotateRight(head *ListNode, k int) *ListNode {
	if head == nil {
		return head
	}
	p := head
	// 节点总数
	size := 1
	for p.Next != nil {
		p = p.Next
		size++
	}
	// 得到最终要移动的次数
	k %= size
	// 链首尾相连
	p.Next = head
	// 记录当前的p: 最后一个位置
	last := p
	p = head
	// 移动值 k次
	for i := 0; i < k; i++ {
		cur := p.Val
		nextVal := p.Next.Val
		for j := 0; j < size; j++ {
			p.Next.Val = cur
			p = p.Next
			cur = nextVal
			nextVal = p.Next.Val
		}
	}
	// 断链
	last.Next = nil
	return head
}

运行结果
技术分享图片

方式二

借助额外的切片存储所有的节点值,核心在于记录初始位置,可以直接得到移动k步后的值,性能理论上来说或许更快

代码

func rotateRight(head *ListNode, k int) *ListNode {
	if head == nil {
		return head
	}
	p := head
	// 存储各位置的初始节点
	vals := []int{p.Val}
	for p.Next != nil {
		p = p.Next
		vals = append(vals, p.Val)
	}
	// 得到最终要移动的次数
	k %= len(vals)
	p = head
	for i := 0; i < len(vals); i++ {
		// 当前值来源于当前值-k
		p.Val = vals[(len(vals)-k+i) %len(vals)]
		p = p.Next
	}
	return head
}

运行结果
技术分享图片

Leetcode每日一题-61.旋转链表

原文:https://www.cnblogs.com/blog-zhangtong/p/14584933.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!