golang算法-链表逆序
原创
©著作权归作者所有:来自51CTO博客作者fwhezfwhez的原创作品,请联系作者获取转载授权,否则将追究法律责任
前言
链表逆序,表述的场景为:
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()
}
仓库地址
点我