关于golang中list链表的排序操作文章少之又少,因此基于这个情况,特此写个简单的Demo供大家分享
需求背景比如,现在有个需求,list链表中存入了用户信息,但是是无序的,需要根据用户的年龄和姓名,给list链表中的数据,进行简单排序
1.定义用户结构体
type Person struct {
Name string //名称
Age int //年龄
}
2.存入用户数据
l := list.New()
l.PushBack(Person{1, "张三"})
l.PushBack(Person{3, "李四"})
l.PushBack(Person{2, "王五"})
l.PushBack(Person{3, "马六"})
3.打印现有数据顺序
for v := l.Front(); v != nil; v = v.Next() {
fmt.Println("age:", v.Value.(Person).Age)
}
4.排序算法
func Sort(oldList *list.List) (newList *list.List) {
newList = list.New()
//用老链表进行遍历 与新链表进行表
for v := oldList.Front(); v != nil; v = v.Next() {
node := newList.Front()
for nil != node {
//年龄比较
if node.Value.(Person).Age > v.Value.(Person).Age {
//InsertBefore 元素塞在前面
newList.InsertBefore(v.Value.(Person), node)
break
} else if node.Value.(Person).Age == v.Value.(Person).Age {
//姓名比较
if node.Value.(Person).Name > v.Value.(Person).Name {
newList.InsertBefore(v.Value.(Person), node)
break
}
}
//当前元素与v比较 不符合 if条件 则取新List的下个元素
node = node.Next()
}
//能走到这步 则表明v只能放入链表最后
if node == nil {
newList.PushBack(v.Value.(Person))
}
}
return newList
}
5.完整程序
package main
import (
"container/list"
"fmt"
)
type Person struct {
Age int
Name string
}
func main() {
l := list.New()
l.PushBack(Person{1, "张三"})
l.PushBack(Person{3, "李四"})
l.PushBack(Person{2, "王五"})
l.PushBack(Person{3, "马六"})
for v := l.Front(); v != nil; v = v.Next() {
fmt.Println("age:", v.Value.(Person).Age)
}
newList := Sort(l)
for v := newList.Front(); v != nil; v = v.Next() {
fmt.Println(" name age", v.Value.(Person).Age, v.Value.(Person).Name)
}
}
// //链表排序
func Sort(oldList *list.List) (newList *list.List) {
newList = list.New()
//用老链表进行遍历 与新链表进行表
for v := oldList.Front(); v != nil; v = v.Next() {
node := newList.Front()
for nil != node {
//年龄比较
if node.Value.(Person).Age > v.Value.(Person).Age {
//InsertBefore 元素塞在前面
newList.InsertBefore(v.Value.(Person), node)
break
} else if node.Value.(Person).Age == v.Value.(Person).Age {
//姓名比较
if node.Value.(Person).Name > v.Value.(Person).Name {
newList.InsertBefore(v.Value.(Person), node)
break
}
}
//当前元素与v比较 不符合 if条件 则取新List的下个元素
node = node.Next()
}
//能走到这步 则表明v只能放入链表最后
if node == nil {
newList.PushBack(v.Value.(Person))
}
}
return newList
}
6.输出结果
age: 1
age: 3
age: 2
age: 3
name age 1 张三
name age 2 王五
name age 3 李四
name age 3 马六
至此,简单的Demo已经写好啦,希望大家喜欢,同时欢迎批评指正,有同情心的小伙伴可以
打赏下哦!