这里的问题都是来自于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