go 单链表的增加,删除,翻转

package main

import "fmt"

//单链的数据结构
type Node struct {
    value int
    next  *Node
}

//单链表,head 头结点表示单链表
type List struct {
    head *Node
}

//创建单链表
func createOneList() *List {
    return &List{head: nil}
}

//增加链表结点
func (l *List) addElement(value int) {
    if l.head == nil {
        node := Node{value: value}
        l.head = &node
        return
    }
    item := l.head
    //遍历找到合适的插入位置
    for {
        if item.value == value {
            break
        }
        if item.value > value {
            //fmt.Printf("item.value %v value %v \n", item.value, value)
            temNode := Node{
                next:  item.next,
                value: item.value,
            }
            item.next = &temNode
            item.value = value
            break
        }
        if item.value < value && item.next == nil {
            temNode := Node{
                value: value,
            }
            item.next = &temNode
            break

        }

        item = item.next
    }

}

//删除链表指定结点
func (l *List) deleteElement(value int) {
    if l.head == nil {
        return
    }
    item := l.head
    //非最后一个结点
    for ; item.next != nil; item = item.next {
        if item.value == value {
            item.value = item.next.value //需要先赋值value
            item.next = item.next.next
            break
        }
        //最后一个结点
        if item.next.value == value && item.next.next == nil {
            item.next = nil
        }

    }

}

//翻转单链
func (l *List) reserveLink(n *Node) {
    //如果链表为空,或者链表只有一个结点则返回
    if n == nil || n.next == nil {
        return
    }
    var prev *Node
    current := n
    //fmt.Printf("%v", current)
    //首先判断链表是否为空或只有一个节点,如果是,则直接返回不进行翻转。
    //如果不是,则定义prev和current两个指针,分别指向链表的前一个节点和当前节点。
    //在循环中,首先保存当前节点的下一个节点,将当前节点指向前一个节点,然后将指针向后移动。最后,将链表头指向翻转后的最后一个节点prev
    for current != nil {
        next := current.next
        current.next = prev
        //fmt.Printf("%v \n", current.value)
        prev = current
        current = next

    }
    l.head = prev
}

//展示链表结点
func (l *List) showList() {
    item := l.head
    for ; item != nil; item = item.next {
        fmt.Printf("展示元素 %v \n", item.value)

    }

}
func main() {
    fmt.Println(3333)
    oneList := createOneList()
    //  fmt.Printf("%v", oneList)
    oneList.addElement(11)
    oneList.addElement(57)
    //oneList.showList()
    oneList.addElement(23)
    oneList.addElement(8)

    oneList.addElement(5)

    oneList.showList()
    oneList.deleteElement(8)
    fmt.Printf("展示删除后的链表结点\n")
    oneList.showList()
    oneList.reserveLink(oneList.head)
    fmt.Printf("展示翻转后的链表结点\n")
    oneList.showList()
}

  

posted on 2023-07-19 10:01  running-fly  阅读(8)  评论(0编辑  收藏  举报

导航