zoukankan      html  css  js  c++  java
  • 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")
        }
    }
  • 相关阅读:
    springMVC(5)---导入excel文件数据到数据库
    springMVC(4)---生成excel文件并导出
    springMVC(3)---利用pdf模板下载
    springMVC(1)---@RequestMapping详解
    springMVC(2)---获取前段数据
    【JS】---5 JS通过事件隐藏显示元素
    【JS】---4用JS获取地址栏参数方法
    【功能代码】---3 JS判断字符串是否包含某个字符串
    基于maven的ssm框架整合
    java提高(9)---HashMap解析
  • 原文地址:https://www.cnblogs.com/tgzmos/p/14919776.html
Copyright © 2011-2022 走看看