数据结构--单向链表

83 阅读2分钟

单向链表的一种Go语言实现

package main

import "fmt"

type Node struct {
	no int
	name string
	next *Node
}

//实现尾部插入一个节点到链表(队列Push的一种实现)
func InsertTail(head *Node, newNode *Node){
	//先找到链表的最后一个节点,需要保持头结点不动,这里创建一个中间临时节点
	temp := head
	//遍历链表直到最后一个节点进行插入
	for {
		if temp.next == nil { //这个条件就是链表的最后位置
			break
		}
		temp = temp.next
	}
	//将新的节点接入到链表尾部
	temp.next = newNode
}

//实现有序插入一个节点到链表中
func InsertSort(head, newNode *Node){
	temp := head
	//重点:插入时必须要在temp的位置让temp.next.no和newNode.no进行比较,不然会错过插入时机
	for {
		if temp.next == nil { //说明已经在链表的尾部了
			//注意:下面两行的顺序不能颠倒
			newNode.next = temp.next
			temp.next = newNode
			break
		} else if temp.next.no >= newNode.no {
			newNode.next = temp.next
			temp.next = newNode
			break
		}
		temp = temp.next
	}
}

//实现头部插入节点(队列Push的一种实现)
func InsertHead(head, newNode *Node){
	newNode.next = head.next
	head.next = newNode
}

//实现一个删除链表节点的函数
func Delete(head *Node, node *Node) {
	temp := head
	for {
		if temp.next == nil { //说明已经在链表的尾部了,没有找到要删除的节点
			break
		} else if temp.next.no == node.no {
			temp.next = node.next
			//下面这种方法也可以,不过理解起来有点绕
			//temp.next = temp.next.next
			break
		}
		temp = temp.next
	}
}

//实现一个头部删除链表节点的函数(队列Pop的一种实现)
func DeleteHead(head *Node){
	if head.next == nil{
		return
	}else {
		head.next = head.next.next
	}
}

//实现一个尾部删除链表节点的函数(队列Pop的一种实现)
func DeleteTail(head *Node){
	temp := head
	for {
		if temp.next == nil{ //说明链表为空
			return
		}else if temp.next.next == nil{
			temp.next = nil
			break
		}
		temp = temp.next
	}
}

//实现显示链表中所有节点信息
func List(head *Node){
	//前提是不能改变头结点
	temp := head
	if temp.next == nil {
		fmt.Println("链表为空")
		return
	}

	for {
		fmt.Printf("%d  %s -->", temp.next.no, temp.next.name) //打印下一个节点的信息
		temp = temp.next
		if temp.next == nil {
			break
		}
	}
}

func main(){

	//定义一个头结点
	head := &Node{}
	//定义一个节点信息
	node1 := &Node{
		no:   1,
		name: "Number1",
		next: nil,
	}
	node2 := &Node{
		no:   2,
		name: "Number2",
		next: nil,
	}
	node3 := &Node{
		no:   3,
		name: "Number3",
		next: nil,
	}
	node4 := &Node{
		no:   2,
		name: "Number4",
		next: nil,
	}

	InsertTail(head, node1)
	InsertTail(head, node2)

	InsertSort(head, node3)
	InsertSort(head, node2)
	InsertSort(head, node1)
	InsertSort(head, node4)

	Delete(head, node4)

	InsertHead(head, node1)
	InsertHead(head, node2)
	InsertHead(head, node3)
	InsertHead(head, node4)
	DeleteHead(head)
	DeleteTail(head)
	List(head)
}