1. 程式人生 > 其它 >go 實現單鏈表並使用一種常規實現翻轉,一種使用遞迴實現翻轉

go 實現單鏈表並使用一種常規實現翻轉,一種使用遞迴實現翻轉

package main

import "fmt"

type ListNode struct {
    next  *ListNode
    value interface{}
}

type LinkedList struct {
    head   *ListNode
    length uint
}

func NewListNode(v interface{}) *ListNode {
    return &ListNode{nil, v}
}

func (this *ListNode) GetNext() *ListNode {
    return this.next
} func (this *ListNode) GetValue() interface{} { return this.value } func NewLinkedList() *LinkedList { return &LinkedList{NewListNode(0), 0} } //在某個節點後面插入節點 func (this *LinkedList) InsertAfter(p *ListNode, v interface{}) bool { if nil == p { return false } newNode := NewListNode(v) oldNext
:= p.next p.next = newNode newNode.next = oldNext this.length++ return true } //在某個節點前面插入節點 func (this *LinkedList) InsertBefore(p *ListNode, v interface{}) bool { if nil == p || p == this.head { return false } cur := this.head.next pre := this.head for nil != cur {
if cur == p { break } pre = cur cur = cur.next } if nil == cur { return false } newNode := NewListNode(v) pre.next = newNode newNode.next = cur this.length++ return true } //在連結串列頭部插入節點 func (this *LinkedList) InsertToHead(v interface{}) bool { return this.InsertAfter(this.head, v) } //在連結串列尾部插入節點 func (this *LinkedList) InsertToTail(v interface{}) bool { cur := this.head for nil != cur.next { cur = cur.next } return this.InsertAfter(cur, v) } //通過索引查詢節點 func (this *LinkedList) FindByIndex(index uint) *ListNode { if index >= this.length { return nil } cur := this.head.next var i uint = 0 for ; i < index; i++ { cur = cur.next } return cur } //刪除傳入的節點 func (this *LinkedList) DeleteNode(p *ListNode) bool { if nil == p { return false } cur := this.head.next pre := this.head for nil != cur { if cur == p { break } pre = cur cur = cur.next } if nil == cur { return false } pre.next = p.next p = nil this.length-- return true } //列印連結串列 func (this *LinkedList) Print() { cur := this.head.next format := "" for nil != cur { format += fmt.Sprintf("%+v", cur.GetValue()) cur = cur.next if nil != cur { format += "->" } } fmt.Println(format) } /* 單鏈表反轉 時間複雜度:O(N) */ func (this *LinkedList) Reverse() { if nil == this.head || nil == this.head.next || nil == this.head.next.next { return } var pre *ListNode = nil cur := this.head.next for nil != cur { tmp := cur.next cur.next = pre pre = cur cur = tmp } this.head.next = pre } /* 判斷單鏈表是否有環 */ func (this *LinkedList) HasCycle() bool { if nil != this.head { slow := this.head fast := this.head for nil != fast && nil != fast.next { slow = slow.next fast = fast.next.next if slow == fast { return true } } } return false } /* 刪除倒數第N個節點 */ func (this *LinkedList) DeleteBottomN(n int) { if n <= 0 || nil == this.head || nil == this.head.next { return } fast := this.head for i := 1; i <= n && fast != nil; i++ { fast = fast.next } if nil == fast { return } slow := this.head for nil != fast.next { slow = slow.next fast = fast.next } slow.next = slow.next.next } /* 獲取中間節點 */ func (this *LinkedList) FindMiddleNode() *ListNode { if nil == this.head || nil == this.head.next { return nil } if nil == this.head.next.next { return this.head.next } slow, fast := this.head, this.head for nil != fast && nil != fast.next { slow = slow.next fast = fast.next.next } return slow } /* 兩個有序單鏈表合併 */ func MergeSortedList(l1, l2 *LinkedList) *LinkedList { if nil == l1 || nil == l1.head || nil == l1.head.next { return l2 } if nil == l2 || nil == l2.head || nil == l2.head.next { return l1 } l := &LinkedList{head: &ListNode{}} cur := l.head curl1 := l1.head.next curl2 := l2.head.next for nil != curl1 && nil != curl2 { if curl1.value.(int) > curl2.value.(int) { cur.next = curl2 curl2 = curl2.next } else { cur.next = curl1 curl1 = curl1.next } cur = cur.next } if nil != curl1 { cur.next = curl1 } else if nil != curl2 { cur.next = curl2 } return l } /* * 遞迴實現 翻轉 */ func (this *LinkedList) reve() bool { head := reverseList(this.head) p := head for true { if p == nil { break } else { if p.value == 0 { break } this.InsertToTail(p.value) p = p.next } } return true } func reverseList(node *ListNode) *ListNode { if node.next == nil { return node } else { newHead := reverseList(node.next) node.next.next = node node.next = nil return newHead } } func main() { list := NewLinkedList() list.InsertToTail(2) list.InsertToHead(1) list.InsertToTail(3) list.InsertToTail(4) list.Reverse() //list.reve() list.Print() if list.HasCycle() { fmt.Println("has cycle") } }