package main
import (
"fmt"
)
type Node struct {
value int
label string
next *Node
}
// printList prints the linked list values and labels
func printList(head *Node) {
for curr := head; curr != nil; curr = curr.next {
fmt.Printf("%d%s", curr.value, curr.label)
if curr.next != nil {
fmt.Print(" -> ")
}
}
fmt.Println(" -> null")
}
// stableSort performs a stable insertion sort on linked list
func stableSort(head *Node) *Node {
if head == nil || head.next == nil {
return head
}
dummy := &Node{value: 0, label: ""} // dummy head for sorted list
dummy.next = head
curr := head.next
head.next = nil
for curr != nil {
next := curr.next
pos := dummy
// find position to insert curr
for pos.next != nil && pos.next.value < curr.value {
pos = pos.next
}
// insert curr after pos
curr.next = pos.next
pos.next = curr
curr = next
}
return dummy.next
}
func main() {
// create list: 5a -> 3 -> 5b -> 2 -> 3
n5b := &Node{value: 5, label: "b", next: nil}
n3b := &Node{value: 3, label: "", next: n5b}
n2 := &Node{value: 2, label: "", next: n3b}
n5a := &Node{value: 5, label: "a", next: n2}
n3a := &Node{value: 3, label: "", next: n5a}
head := n3a
fmt.Print("Original list: ")
printList(head)
head = stableSort(head)
fmt.Print("Sorted list: ")
printList(head)
}
for pos.next != nil && pos.next.value < curr.value { pos = pos.next }
find insertion position keeping order for equal values
curr.next = pos.next; pos.next = curr
insert current node in sorted position
advance to next node to sort
Original list: 3 -> 5a -> 2 -> 3 -> 5b -> null
Sorted list: 2 -> 3 -> 3 -> 5a -> 5b -> null