go实现循环链表

                                  时间平复了一时的冲动,却加深了挫败感。
                                                                               ——马尔克斯  《百年孤独》

 

上代码

package main

import "fmt"

/*
  这次先基于单链表实现循环链表,双向的下次补上。
  循环链表:循环链表的所有节点形成一个环。单链表的尾节点指向首节点形成单向循环链表
*/
type DanNode struct {
	Data int
	Next *DanNode
}

type DanList struct {
	First *DanNode
	Last  *DanNode
	Size  int
}

// 创建一个空的单链表
func CreateNewDanAirList() (list *DanList) {
	return &DanList{}
}

// 给链表末尾新增一个节点
func (list *DanList) AddOneNodeToDan(value int) {
	newNode := new(DanNode)
	newNode.Data = value

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

	list.Size += 1
}

// 删除链表末尾节点
func (list *DanList) RemoveOneNode() {

	// 链表为空时
	if list.Size < 1 {
		return
	}
	// 链表的长度>=1时
	lastCount := list.Size
	last2Count := list.Size - 1
	if lastCount == 1 {
		list.First = nil
		list.Last = nil
		return
	}
	var last2Node *DanNode
	currentNode := list.First
	for i := 1; i <= lastCount; i++ {
			if i >= 2 {
				currentNode = currentNode.Next
				if i == last2Count {
					last2Node = currentNode
				}
			}
	}

	last2Node.Next = list.First
	list.Last = last2Node

	list.Size -= 1
}

// 删除链表首节点
func (list *DanList) RemoveOneNodeFront() {
	if list.Size < 1 {
		return
	}

	firstNode := list.First
	list.First = firstNode.Next
	list.Last.Next = list.First
	list.Size -= 1
}

// 给链表开始新增一个节点
func (list *DanList) AddOneNodeToDan2Front(value int) {
	newNode := new(DanNode)
	newNode.Data = value

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

	list.Size += 1
}

// 打印链表
func (list *DanList) PrintDan() {
	if list.Size == 0 {
		return
	}

	currentNode := &DanNode{}
	for i := 0; i < list.Size; i++ {
		if i == 0 {
			currentNode = list.First
		}

		if currentNode.Next == list.First {
			fmt.Print(currentNode.Data, "\t")
			return
		}

		fmt.Print(currentNode.Data, "\t")
		currentNode = currentNode.Next
	}
}

func main() {
	list := CreateNewDanAirList()
	fmt.Println("新增元素:")
	list.AddOneNodeToDan(17)
	list.AddOneNodeToDan(18)
	list.AddOneNodeToDan(19)
	list.PrintDan()                                                     // 17   18	19
	fmt.Println("尾结点", list.Last.Data, "的下一个节点是:", list.Last.Next.Data) //17	18	19	尾结点 19 的下一个节点是: 17
	list.AddOneNodeToDan2Front(16)                                      // 给开头新增元素,值为16
	fmt.Println("给开头新增一个元素16作为首节点:")
	list.PrintDan()      // 16  17	18	19
	list.RemoveOneNode() // 删除尾节点
	fmt.Println("\n删除尾节点")
	list.PrintDan() // 16  17	18
	fmt.Println("\n删除首节点:")
	list.RemoveOneNodeFront()
	list.PrintDan() // 17	18
}

控制台:

新增元素:
17	18	19	尾结点 19 的下一个节点是: 17
给开头新增一个元素作为首节点:
16	17	18	19	
删除尾节点
16	17	18	
删除首节点:
17	18	
Process finished with exit code 0

双链表的实现可移步:双向链表实现

发布了177 篇原创文章 · 获赞 116 · 访问量 8万+

猜你喜欢

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