前言
關於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已經寫好啦,希望大家喜歡,同時歡迎批評指正,有同情心的小夥伴可以