无环单链表的最小字典序(Go实现)

题目来自2021腾讯实习生招聘-技术研发综合-第三次笔试
题目描述:牛牛有一个无环的单链表,牛牛可以不停的旋转这个链表,比如链表:1->2->3->4,经过旋转后可以变成一下4中链表:
4->1->2->3
3->4->1->2
2->3->4->1
1->2->3->4
牛牛想找到一个旋转的链表,它表示序列的字典序最小。定义序列{a}的字典序小于序列{b}:存在一个位置j,满足对于所有的i<j,ai=bi,且aj<bj,这个例子的最小字典序列就是1->2->3->4。
使用go实现,思路:将单链表变成单向循环链表,枚举n(链表长度)个起始位置,记录当前字典序最小的那个起始位置。

package main

import "fmt"

type ListNode struct {
	val int
	next *ListNode
}
func main() {
	var L *ListNode
	L = CreatList(L)
	solve(L)
}
func solve(L *ListNode)(*ListNode) {
	if L == nil {
		return L
	}
	len := 1   //记录链表的长度
	res, q, p := L, L, L.next
	//cur1, cur2 :=
	for q.next != nil {
		q = q.next
		len++
	}
	q.next = L //最后一个节点的next指针指向第一个节点,将单链表变成循环链表
	for ; p != L; p = p.next {
		if cmp(L, res, p, len) > 0 {  //维护一个最小字典序列的起始位置res,如果p开头的链表的字典序列小于res开头的链表,则res=p
			res = p
		}
	}
	w := res
	for i := 0; i < len; i++ {
		fmt.Printf("%d ", w.val)
		w = w.next
	}
	return res
}
func cmp(L, p, q *ListNode, n int) int {//比较以p,q两个节点开始的,长度为n的序列的字典序列大小关系
	a, b := p, q
	for i := 0; i < n; i++ {
		if a.val == b.val {
			a = a.next
			b = b.next
		}else if a.val > b.val {
			return 1
		}else {
			return -1
		}
	}
	return 0
}
func CreatList(L *ListNode)(* ListNode) {//尾插法创建链表
	var x int
	L = &ListNode{}
	var r *ListNode  //r为表尾指针
	r = L
	fmt.Scan(&x)
	for x != 9999 {
		s := &ListNode{x, nil}
		r.next = s
		r = s
		fmt.Scan(&x)
	}
	L = L.next
	//f := L
	//for f != nil {
	//	fmt.Printf("%d ", f.val)
	//	f = f.next
	//}
	return L
}

思路参考:https://www.cnblogs.com/lfri/p/9329945.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值