首页 > 编程语言 >golang算法-链表逆序

golang算法-链表逆序

时间:2022-11-22 11:39:26浏览次数:58  
标签:Node golang nil Insert next 链表 Header Next 逆序


前言

链表逆序,表述的场景为:
A->B->C->D 逆序后: D->C>B>A

分析

  • 需要插入数据,Insert方法
  • 需要打印数据,Print方法
  • 插入数据时,需要定位最后一个节点,LastNode方法
  • 最少需要两个偏移量进行迭代,因为,当判定条件成立时,需要将链表的头部,指向空值的父节点。

LastNode()

// 链表的长度,不包过头
type Node struct {
Next *Node
Data int
}
type LinkList struct {
Header *Node
}

func NewLinkList() *LinkList {
return &LinkList{
Header: &Node{
Next: nil,
Data: 0,
},
}
}

// 获取最后的节点
func (l *LinkList) LastNode() *Node {
if l.Header == nil {
return nil
}
var flag = l.Header
var next = l.Header.Next
for next != nil {
flag = next
next = next.Next
}
return flag
}

// 获取最后的节点, 输出 &{nil, 7}
func TestLastNode(t *testing.T) {
l := NewLinkList()
l.Insert(&Node{nil, 5})
l.Insert(&Node{nil, 6})
l.Insert(&Node{nil, 7})

fmt.Println(l.LastNode())
}

Insert(), Print()

func (l *LinkList) Insert(node *Node) {
lastNode := l.LastNode()
lastNode.Next = node
}

func (l *LinkList) Print() {
var rs = make([]int, 0, 10)

if l.Header == nil {
fmt.Println(rs)
}
var next = l.Header.Next
for next != nil {
rs = append(rs, next.Data)
next = next.Next
}
fmt.Println(rs)
}

// 输出 [5, 6, 7]
func TestPrint(t *testing.T) {
l := NewLinkList()
l.Insert(&Node{nil, 5})
l.Insert(&Node{nil, 6})
l.Insert(&Node{nil, 7})

l.Print()
}

链表逆序
// 输出 [10, 9 ,8, 7 ,6 , 5]

func TestReverseLinkList(t *testing.T) {
l := NewLinkList()
l.Insert(&Node{nil, 5})
l.Insert(&Node{nil, 6})
l.Insert(&Node{nil, 7})
l.Insert(&Node{nil, 8})
l.Insert(&Node{nil, 9})
l.Insert(&Node{nil, 10})

var flag, next *Node
next = l.Header.Next
var tmp *Node
for next!=nil {
tmp = next.Next
next.Next = flag

flag=next
next = tmp
}
l.Header.Next = flag
l.Print()
}

仓库地址

​点我​



标签:Node,golang,nil,Insert,next,链表,Header,Next,逆序
From: https://blog.51cto.com/u_11553781/5877233

相关文章