链表问题:反转和判断是否有环

本文介绍了如何用Golang解决LeetCode中的链表问题,包括链表反转、两两交换节点、判断链表是否有环以及找到环形链表中尾节点连接的位置。通过定义链表节点结构,详细解析了每个问题的解决思路和算法实现,最后还提供了测试代码以验证算法的正确性。
摘要由CSDN通过智能技术生成

这里的问题都是来自于LeetCode,并且算法均由Golang实现。

  • 链表的反转
  • 两两交换链表中的节点
  • 判断链表中是否有环
  • 找到环形链表中尾节点连接到链表中的位置

首先需要定义链表节点的结构

type ListNode struct {
   
	Val  int
	Next *ListNode
}

一、链表的反转

两个节点指向反转,然后逐步后移

func reverseList(head *ListNode) *ListNode {
   

	if nil == head || nil == head.Next {
   
		return head
	}

	var pre *ListNode = nil
	cur := head
	var next *ListNode
	for cur != nil {
    // 当前节点不为空就可以参与反置工作,不需要要求next不为空
		next = cur.Next
		cur.Next = pre
		pre = cur
		cur = next
	}
	return pre
}

递归实现链表反转。当有n个节点,就链表而言,反转的问题可以理解为第n个节点完成了反转,然后考虑前n-1个节点的反转问题。所以递归实现如下:

/*
n1 --> n2 --> ... --> n(k-1) --> n(k) --> n(k+1) --> ... --> n(m) --> nil

	n(m) --> nil , n1 --> n2 --> ... --> n(k-1) --> n(k) --> n(k+1) --> ... --> n(m-1) --> n(m)
	n(m) --> n(m-1) --> nil, n1 --> n2 --> ... --> n(k-1) --> n(k) --> n(k+1) --> ... --> n(m-1)
	n(m) --> n(m-1) --> ... --> n(k+1) --> nil, n1 --> n2 --> ... --> n(k-1) --> n(k) --> n(k+1) :
		n(k).Next.Next = n(k) ----- n(k+1) --> n(k)
		n(k).Next = nil ----------- n(k+1) --> n(k) --> nil
*/
func reverseList1(head *ListNode) *ListNode {
   
	if nil == head 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值