go实现双链表各操作

上代码:

import "fmt"
/*
--操作思路--
从链表左边取出一个节点:首节点指针右移一位,首节点为nil,长度减一;
给链表末尾新增一个节点:以传入的数据new一个节点,
  1,链表为空时,该node作为链表的首节点、尾节点;
  2,不为空时,该节点赋值到旧的末节点的next,该节点的前置指针为旧的末节点,该节点赋值为链表的末节点,该节点的next为nil,链表长度+1;
*/
type Node struct {
	Pre  *Node
	Next *Node
	Data string
}

type List struct {
	First *Node
	Last  *Node
	Size  int
}

// 从链表末尾取下一个节点
func (list *List) RemoveOneNode() {
	node := list.Last.Pre
	node.Next = nil
	list.Last = node
	list.Size -= 1
}

// 给链表末尾新增一个节点
func (list *List) AddOneNode(value string) {
	newNode := new(Node)
	newNode.Data = value

	// 链表为空时
	if list.Size < 1 {
		list.First = newNode
		list.Last = newNode
	} else {
		// 链表的长度>=1时
		lastNode := list.Last
		lastNode.Next = newNode
		newNode.Pre = lastNode
		newNode.Next = nil
		list.Last = newNode
	}

	list.Size += 1
}

// 创建一个空的双链表
func CreateNewAirList() (list *List) {
	return &List{}
}

// 打印链表
func (list *List) Print() {
	currentNode := list.First
	fmt.Print(currentNode.Data, "\t")
	for i := 0; i < list.Size; i++ {
		if currentNode.Next == nil {
			return
		}
		currentNode = currentNode.Next
		fmt.Print(currentNode.Data, "\t")
	}

}

func main() {
	list := CreateNewAirList()
	list.AddOneNode("A")
	list.AddOneNode("B")
	list.AddOneNode("C")
	fmt.Println(list.First.Data, list.First.Next.Data, list.Last.Data)		// 打印方式1
	list.Print()	// 打印方式2
}

控制台打印:

A B C
A	B	C	
发布了172 篇原创文章 · 获赞 114 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/HYZX_9987/article/details/104519253