• go语言|数据结构:单链表(2)


    目录

    单向链表

    首元结点

    头结点

    头指针

    链表与节点

    插入单个元素

    数组插入链表

    链表长度

    链表副本

    链表拼接

    Cat()追加

    Add()左加

    节点删除

    删除首元结点

    删除尾结点

    习题解答


    单向链表

      又称单链表,单链表中每个结点包含两部分,分别是数据域和指针域,上一个结点的指针指向下一结点,依次相连,形成链表。三个概念:首元结点、头结点和头指针,其中头结点在链表中不是必须的。

    首元结点

    就是链表中存储第一个元素的结点。

    头结点

    是在首元结点之前附设的一个结点,其指针域指向首元结点。头结点的数据域可以存储链表的长度或者其它的信息,也可以为空不存储任何信息。

    头指针

    是指向链表中第一个结点的指针。若链表中有头结点,则头指针指向头结点;若链表中没有头结点,则头指针指向首元结点。

    链表与节点

    引入单链表结构LinkList,仅保留头指针;与节点结构ListNode配合使用。头指针为空的单链表即为空链表,解决只使用节点结构不能构造空表的缺点。

    1. type ListNode struct {
    2. data int
    3. next *ListNode
    4. }
    5. type LinkList struct {
    6. next *ListNode
    7. }

    插入单个元素

    头插法pushHead() 、 尾插法pushTail()

    1. package main
    2. import "fmt"
    3. type ListNode struct {
    4. data int
    5. next *ListNode
    6. }
    7. type LinkList struct {
    8. next *ListNode
    9. }
    10. func (head *LinkList) pushHead(value int) {
    11. node := &ListNode{data: value}
    12. node.next = head.next
    13. head.next = node
    14. }
    15. func (head *LinkList) pushTail(value int) {
    16. node := &ListNode{data: value}
    17. p := head.next
    18. if p != nil {
    19. for p.next != nil {
    20. p = p.next
    21. }
    22. p.next = node
    23. } else {
    24. head.next = node
    25. }
    26. }
    27. func (node *ListNode) travel() {
    28. for node != nil {
    29. fmt.Print(node.data)
    30. node = node.next
    31. if node != nil {
    32. fmt.Print("->")
    33. }
    34. }
    35. fmt.Println("")
    36. }
    37. func (head *LinkList) travel() {
    38. head.next.travel()
    39. }
    40. func main() {
    41. nodes := &LinkList{}
    42. nodes.travel()
    43. nodes.pushTail(1)
    44. nodes.travel()
    45. nodes.pushHead(2)
    46. nodes.pushHead(3)
    47. nodes.travel()
    48. nodes.pushTail(4)
    49. nodes.pushTail(5)
    50. nodes.travel()
    51. }
    52. /*输出:
    53. 1
    54. 3->2->1
    55. 3->2->1->4->5
    56. */

    数组插入链表

    优化后插入多个元素:push()前插、append()追加

    1. package main
    2. import "fmt"
    3. type Node struct {
    4. data int
    5. next *Node
    6. }
    7. type List struct {
    8. next *Node
    9. }
    10. func (head *List) push(list []int) {
    11. for i := len(list) - 1; i >= 0; i-- {
    12. node := &Node{data: list[i]}
    13. node.next = head.next
    14. head.next = node
    15. }
    16. }
    17. func (head *List) append(list []int) {
    18. for i := 0; i < len(list); i++ {
    19. node := &Node{data: list[i]}
    20. p := head.next
    21. if p != nil {
    22. for p.next != nil {
    23. p = p.next
    24. }
    25. p.next = node
    26. } else {
    27. head.next = node
    28. }
    29. }
    30. }
    31. func (head *List) travel() {
    32. node := head.next
    33. for node != nil {
    34. fmt.Print(node.data)
    35. node = node.next
    36. if node != nil {
    37. fmt.Print("->")
    38. }
    39. }
    40. fmt.Println("")
    41. }
    42. func main() {
    43. node1 := &List{}
    44. node1.travel()
    45. node1.push([]int{1, 2, 3, 5})
    46. node1.travel()
    47. node1.append([]int{7, 8, 9})
    48. node1.travel()
    49. node1.push([]int{-2, -1, 0})
    50. node1.travel()
    51. node2 := &List{}
    52. node2.travel()
    53. node2.append([]int{1, 2, 3, 5})
    54. node2.travel()
    55. node2.push([]int{-2, -1, 0})
    56. node2.travel()
    57. node2.append([]int{7, 8, 9})
    58. node2.travel()
    59. }
    60. /*输出:
    61. 1->2->3->5
    62. 1->2->3->5->7->8->9
    63. -2->-1->0->1->2->3->5->7->8->9
    64. 1->2->3->5
    65. -2->-1->0->1->2->3->5
    66. -2->-1->0->1->2->3->5->7->8->9
    67. */

    链表长度

    1. package main
    2. import "fmt"
    3. type Node struct {
    4. data int
    5. next *Node
    6. }
    7. type List struct {
    8. next *Node
    9. }
    10. func Len(head *List) int {
    11. length := 0
    12. for p := head.next; p != nil; p = p.next {
    13. length++
    14. }
    15. return length
    16. }
    17. func (head *List) size() int {
    18. return Len(head)
    19. }
    20. func (head *List) build(list []int) {
    21. for i := len(list) - 1; i >= 0; i-- {
    22. node := &Node{data: list[i]}
    23. node.next = head.next
    24. head.next = node
    25. }
    26. }
    27. func main() {
    28. var node1, node2 *List
    29. node1 = new(List)
    30. node2 = new(List)
    31. fmt.Println(node1.size())
    32. node1.build([]int{1, 2, 3, 5})
    33. node2.build([]int{7, 8, 9})
    34. fmt.Println(node1.size())
    35. fmt.Println(Len(node2))
    36. }
    37. /*输出:
    38. 0
    39. 4
    40. 3
    41. */

    链表副本

    1. package main
    2. import "fmt"
    3. type Node struct {
    4. data int
    5. next *Node
    6. }
    7. type List struct {
    8. next *Node
    9. }
    10. func (head *List) Copy() *List {
    11. p := head.next
    12. list := &List{}
    13. node := &Node{p.data, nil}
    14. tail := node
    15. for p = p.next; p != nil; p = p.next {
    16. var linknode = Node{data: p.data}
    17. (*tail).next = &linknode
    18. tail = &linknode
    19. }
    20. list.next = node
    21. return list
    22. }
    23. func (head *List) build(list []int) {
    24. for i := len(list) - 1; i >= 0; i-- {
    25. node := &Node{data: list[i]}
    26. node.next = head.next
    27. head.next = node
    28. }
    29. }
    30. func (head *List) pushHead(value int) {
    31. node := &Node{data: value}
    32. node.next = head.next
    33. head.next = node
    34. }
    35. func (head *List) travel() {
    36. p := head.next
    37. for p != nil {
    38. fmt.Print(p.data)
    39. p = p.next
    40. if p != nil {
    41. fmt.Print("->")
    42. }
    43. }
    44. fmt.Println("")
    45. }
    46. func main() {
    47. var node1, node2 *List
    48. node1 = new(List)
    49. node2 = new(List)
    50. node1.build([]int{1, 2, 3, 5})
    51. node2 = node1
    52. node3 := node1.Copy() //保存副本
    53. node3.travel()
    54. node1.pushHead(0)
    55. node1.travel()
    56. node2.travel()
    57. node3.travel() //保存的副本不随node1变化
    58. }
    59. /*输出:
    60. 1->2->3->5
    61. 0->1->2->3->5
    62. 0->1->2->3->5
    63. 1->2->3->5
    64. */

    链表拼接

    Cat()追加

    与尾插单个元素类似;另外拼接链表的副本有好处的,不信可把.Copy()去掉试试。

    1. package main
    2. import "fmt"
    3. type Node struct {
    4. data int
    5. next *Node
    6. }
    7. type List struct {
    8. next *Node
    9. }
    10. func (head *List) Cat(node *List) {
    11. p := head.next
    12. q := node.Copy() //使用副本,确保node不变
    13. if p != nil {
    14. for p.next != nil {
    15. p = p.next
    16. }
    17. p.next = q.next
    18. } else {
    19. head.next = q.next
    20. }
    21. }
    22. func (head *List) Copy() *List {
    23. p := head.next
    24. list := &List{}
    25. node := &Node{p.data, nil}
    26. tail := node
    27. for p = p.next; p != nil; p = p.next {
    28. var linknode = Node{data: p.data}
    29. (*tail).next = &linknode
    30. tail = &linknode
    31. }
    32. list.next = node
    33. return list
    34. }
    35. func (head *List) build(list []int) {
    36. for i := len(list) - 1; i >= 0; i-- {
    37. node := &Node{data: list[i]}
    38. node.next = head.next
    39. head.next = node
    40. }
    41. }
    42. func (head *List) pushHead(value int) {
    43. node := &Node{data: value}
    44. node.next = head.next
    45. head.next = node
    46. }
    47. func (head *List) pushTail(value int) {
    48. node := &Node{data: value}
    49. p := head.next
    50. if p != nil {
    51. for p.next != nil {
    52. p = p.next
    53. }
    54. p.next = node
    55. } else {
    56. head.next = node
    57. }
    58. }
    59. func (head *List) travel() {
    60. p := head.next
    61. for p != nil {
    62. fmt.Print(p.data)
    63. p = p.next
    64. if p != nil {
    65. fmt.Print("->")
    66. }
    67. }
    68. fmt.Println("")
    69. }
    70. func main() {
    71. var node1, node2 *List
    72. node1 = new(List)
    73. node2 = new(List)
    74. node1.build([]int{1, 2, 3, 5})
    75. node2.build([]int{7, 8, 9})
    76. node3 := &List{}
    77. node3.Cat(node1)
    78. node3.Cat(node2)
    79. node3.travel()
    80. node1.travel()
    81. node2.travel()
    82. }
    83. /*输出:
    84. 1->2->3->5->7->8->9
    85. 1->2->3->5
    86. 7->8->9
    87. */

    Add()左加

    1. package main
    2. import "fmt"
    3. type Node struct {
    4. data int
    5. next *Node
    6. }
    7. type List struct {
    8. next *Node
    9. }
    10. func (head *List) Add(node *List) {
    11. q := node.Copy()
    12. p := q.next
    13. for p.next != nil {
    14. p = p.next
    15. }
    16. p.next = head.next
    17. head.next = q.next
    18. }
    19. func (head *List) Cat(node *List) {
    20. p := head.next
    21. q := node.Copy()
    22. if p != nil {
    23. for p.next != nil {
    24. p = p.next
    25. }
    26. p.next = q.next
    27. } else {
    28. head.next = q.next
    29. }
    30. }
    31. func (head *List) Copy() *List {
    32. p := head.next
    33. list := &List{}
    34. node := &Node{p.data, nil}
    35. tail := node
    36. for p = p.next; p != nil; p = p.next {
    37. var linknode = Node{data: p.data}
    38. (*tail).next = &linknode
    39. tail = &linknode
    40. }
    41. list.next = node
    42. return list
    43. }
    44. func (head *List) build(list []int) {
    45. for i := len(list) - 1; i >= 0; i-- {
    46. node := &Node{data: list[i]}
    47. node.next = head.next
    48. head.next = node
    49. }
    50. }
    51. func (head *List) pushHead(value int) {
    52. node := &Node{data: value}
    53. node.next = head.next
    54. head.next = node
    55. }
    56. func (head *List) pushTail(value int) {
    57. node := &Node{data: value}
    58. p := head.next
    59. if p != nil {
    60. for p.next != nil {
    61. p = p.next
    62. }
    63. p.next = node
    64. } else {
    65. head.next = node
    66. }
    67. }
    68. func (head *List) travel() {
    69. p := head.next
    70. for p != nil {
    71. fmt.Print(p.data)
    72. p = p.next
    73. if p != nil {
    74. fmt.Print("->")
    75. }
    76. }
    77. fmt.Println("")
    78. }
    79. func main() {
    80. var node1, node2 *List
    81. node1 = new(List)
    82. node2 = new(List)
    83. node1.build([]int{1, 2, 3, 5})
    84. node2.build([]int{7, 8, 9})
    85. node3 := &List{}
    86. node3.Add(node1)
    87. node3.travel()
    88. node3.Add(node2)
    89. node3.travel()
    90. node3.Add(node1)
    91. node3.travel()
    92. node3.Cat(node2)
    93. node3.travel()
    94. node1.travel()
    95. node2.travel()
    96. }
    97. /*输出:
    98. 1->2->3->5
    99. 7->8->9->1->2->3->5
    100. 1->2->3->5->7->8->9->1->2->3->5
    101. 1->2->3->5->7->8->9->1->2->3->5->7->8->9
    102. 1->2->3->5
    103. 7->8->9
    104. */

    节点删除

    节点删除需要判断链表自身是否为空链表,判断条件增加 if head.next == nil || p.next == nil {...}

    删除首元结点

    1. package main
    2. import "fmt"
    3. type Node struct {
    4. data int
    5. next *Node
    6. }
    7. type List struct {
    8. next *Node
    9. }
    10. func (head *List) delHead() {
    11. p := head.next
    12. if head.next == nil || p.next == nil {
    13. head.next = nil
    14. } else {
    15. head.next = p.next
    16. }
    17. }
    18. func (head *List) build(list []int) {
    19. for i := len(list) - 1; i >= 0; i-- {
    20. node := &Node{data: list[i]}
    21. node.next = head.next
    22. head.next = node
    23. }
    24. }
    25. func (head *List) travel() {
    26. for p := head.next; p != nil; p = p.next {
    27. fmt.Print(p.data)
    28. if p.next != nil {
    29. fmt.Print("->")
    30. }
    31. }
    32. fmt.Println("")
    33. }
    34. func main() {
    35. nodes := &List{}
    36. nodes.build([]int{1, 2, 3})
    37. nodes.travel()
    38. nodes.delHead()
    39. nodes.travel()
    40. nodes.delHead()
    41. nodes.travel()
    42. nodes.delHead()
    43. nodes.travel()
    44. nodes.delHead()
    45. nodes.travel()
    46. }
    47. /*输出:
    48. 1->2->3
    49. 2->3
    50. 3
    51. */

    删除尾结点

    1. package main
    2. import "fmt"
    3. type Node struct {
    4. data int
    5. next *Node
    6. }
    7. type List struct {
    8. next *Node
    9. }
    10. func (head *List) delTail() {
    11. p := head.next
    12. if head.next == nil || p.next == nil {
    13. head.next = nil
    14. } else {
    15. for p.next.next != nil {
    16. p = p.next
    17. }
    18. p.next = nil
    19. }
    20. }
    21. func (head *List) build(list []int) {
    22. for i := len(list) - 1; i >= 0; i-- {
    23. node := &Node{data: list[i]}
    24. node.next = head.next
    25. head.next = node
    26. }
    27. }
    28. func (head *List) travel() {
    29. for p := head.next; p != nil; p = p.next {
    30. fmt.Print(p.data)
    31. if p.next != nil {
    32. fmt.Print("->")
    33. }
    34. }
    35. fmt.Println("")
    36. }
    37. func main() {
    38. nodes := &List{}
    39. nodes.build([]int{1, 2, 3})
    40. nodes.travel()
    41. nodes.delTail()
    42. nodes.travel()
    43. nodes.delTail()
    44. nodes.travel()
    45. nodes.delTail()
    46. nodes.travel()
    47. nodes.delTail()
    48. nodes.travel()
    49. }
    50. /*输出:
    51. 1->2->3
    52. 1->2
    53. 1
    54. */

    习题解答

    1. 给定一个已排序链表,删除重复节点,原始链表中多次出现的数字只能保留一次。

    示例1

    输入: 1->1->2
    输出: 1->2

    示例2

    输入: 1->1->2->3->3
    输出: 1->2->3

    1. package main
    2. import "fmt"
    3. type Node struct {
    4. data int
    5. next *Node
    6. }
    7. type List struct {
    8. next *Node
    9. }
    10. func (head *List) removeDuplicates() {
    11. p := head.next
    12. node := &List{}
    13. data := p.data
    14. node.pushTail(data)
    15. for p != nil {
    16. if p.data != data {
    17. data = p.data
    18. node.pushTail(data)
    19. }
    20. p = p.next
    21. }
    22. head.next = node.next
    23. }
    24. func (head *List) pushTail(value int) {
    25. node := &Node{data: value}
    26. p := head.next
    27. if p != nil {
    28. for p.next != nil {
    29. p = p.next
    30. }
    31. p.next = node
    32. } else {
    33. head.next = node
    34. }
    35. }
    36. func (head *List) build(list []int) {
    37. for i := len(list) - 1; i >= 0; i-- {
    38. node := &Node{data: list[i]}
    39. node.next = head.next
    40. head.next = node
    41. }
    42. }
    43. func (head *List) clear() {
    44. head.next = nil
    45. }
    46. func (head *List) travel() {
    47. for p := head.next; p != nil; p = p.next {
    48. fmt.Print(p.data)
    49. if p.next != nil {
    50. fmt.Print("->")
    51. }
    52. }
    53. fmt.Println()
    54. //fmt.Println("")
    55. }
    56. func main() {
    57. nodes := &List{}
    58. nodes.build([]int{1, 1, 2})
    59. nodes.travel()
    60. nodes.removeDuplicates()
    61. nodes.travel()
    62. nodes.clear()
    63. nodes.build([]int{1, 1, 2, 3, 3})
    64. nodes.travel()
    65. nodes.removeDuplicates()
    66. nodes.travel()
    67. nodes.clear()
    68. nodes.build([]int{1, 2, 3, 3, 4, 4, 5})
    69. nodes.travel()
    70. nodes.removeDuplicates()
    71. nodes.travel()
    72. nodes.clear()
    73. nodes.build([]int{1, 1, 1, 2, 3, 3, 3})
    74. nodes.travel()
    75. nodes.removeDuplicates()
    76. nodes.travel()
    77. }
    78. /*输出:
    79. 1->1->2
    80. 1->2
    81. 1->1->2->3->3
    82. 1->2->3
    83. 1->2->3->3->4->4->5
    84. 1->2->3->4->5
    85. 1->1->1->2->3->3->3
    86. 1->2->3
    87. */

    2. 给定一个排序链表,删除所有重复的节点,留原始链表有过重复的数字一个也不留。

    示例1

    输入: 1->2->3->3->4->4->5
    输出: 1->2->5

    示例2

    输入: 1->1->1->2->3
    输出: 2->3

    1. package main
    2. import "fmt"
    3. type Node struct {
    4. data int
    5. next *Node
    6. }
    7. type List struct {
    8. next *Node
    9. }
    10. func (head *List) deleteDuplicates() {
    11. p := head.next
    12. node := &List{}
    13. if p.next == nil || p.data != p.next.data {
    14. node.pushTail(p.data)
    15. }
    16. if p.next != nil {
    17. data := p.data
    18. for p.next.next != nil {
    19. data = p.data
    20. p = p.next
    21. if data != p.data && p.data != p.next.data {
    22. node.pushTail(p.data)
    23. }
    24. }
    25. if p.data != p.next.data {
    26. node.pushTail(p.next.data)
    27. }
    28. }
    29. head.next = node.next
    30. }
    31. func (head *List) pushTail(value int) {
    32. node := &Node{data: value}
    33. p := head.next
    34. if p != nil {
    35. for p.next != nil {
    36. p = p.next
    37. }
    38. p.next = node
    39. } else {
    40. head.next = node
    41. }
    42. }
    43. func (head *List) build(list []int) {
    44. for i := len(list) - 1; i >= 0; i-- {
    45. node := &Node{data: list[i]}
    46. node.next = head.next
    47. head.next = node
    48. }
    49. }
    50. func (head *List) clear() {
    51. head.next = nil
    52. }
    53. func (head *List) travel() {
    54. for p := head.next; p != nil; p = p.next {
    55. fmt.Print(p.data)
    56. if p.next != nil {
    57. fmt.Print("->")
    58. }
    59. }
    60. fmt.Println("")
    61. //fmt.Println("")
    62. }
    63. func main() {
    64. nodes := &List{}
    65. nodes.build([]int{1, 1, 1, 2, 3})
    66. nodes.travel()
    67. nodes.deleteDuplicates()
    68. nodes.travel()
    69. nodes.clear()
    70. nodes.build([]int{1, 2, 3, 3, 4, 4, 5})
    71. nodes.travel()
    72. nodes.deleteDuplicates()
    73. nodes.travel()
    74. nodes.clear()
    75. nodes.build([]int{1, 1, 2, 3, 3, 4, 5})
    76. nodes.travel()
    77. nodes.deleteDuplicates()
    78. nodes.travel()
    79. nodes.clear()
    80. nodes.build([]int{1, 2, 3, 3, 4, 5, 5})
    81. nodes.travel()
    82. nodes.deleteDuplicates()
    83. nodes.travel()
    84. }
    85. /*输出:
    86. 1->1->1->2->3
    87. 2->3
    88. 1->2->3->3->4->4->5
    89. 1->2->5
    90. 1->1->2->3->3->4->5
    91. 2->4->5
    92. 1->2->3->3->4->5->5
    93. 1->2->4
    94. */

    3. 给定两个有序链表(升序),合并为一个新的有序链表并返回。

    示例1

    输入:1->2>4->8
       1->3->3->5->5
    输出:1->1->2->3->3->4->5->5->8

    示例2

    输入:0->2>4->8
       1->3->5->7->9
    输出:0->1->2->3->4->5->6->7->8->9

    1、递归法:

    1. package main
    2. import "fmt"
    3. type Node struct {
    4. data int
    5. next *Node
    6. }
    7. type List struct {
    8. head *Node
    9. }
    10. //递归法合并有序链表
    11. func recurMerge(p1 *Node, p2 *Node) *Node {
    12. if p1 == nil {
    13. return p2
    14. }
    15. if p2 == nil {
    16. return p1
    17. }
    18. p := new(Node)
    19. if p1.data < p2.data {
    20. p = p1
    21. p.next = recurMerge(p1.next, p2)
    22. } else {
    23. p = p2
    24. p.next = recurMerge(p1, p2.next)
    25. }
    26. return p
    27. }
    28. func (list *List) build(lst []int) {
    29. for i := len(lst) - 1; i >= 0; i-- {
    30. node := &Node{data: lst[i]}
    31. node.next = list.head
    32. list.head = node
    33. }
    34. }
    35. func (list *List) Copy() *List {
    36. p := list.head
    37. res := &List{}
    38. if p != nil {
    39. node := &Node{p.data, nil}
    40. q := node
    41. for p = p.next; p != nil; p = p.next {
    42. q.next = &Node{p.data, nil}
    43. q = q.next
    44. }
    45. res.head = node
    46. }
    47. return res
    48. }
    49. func (list *List) travel() {
    50. for p := list.head; p != nil; p = p.next {
    51. fmt.Print(p.data)
    52. if p.next != nil {
    53. fmt.Print("->")
    54. }
    55. }
    56. fmt.Println("")
    57. }
    58. func main() {
    59. List1 := &List{}
    60. List2 := &List{}
    61. List1.build([]int{1, 2, 4, 8})
    62. List2.build([]int{1, 3, 3, 5, 5})
    63. node1 := List1.Copy().head
    64. node2 := List2.Copy().head
    65. List0 := &List{}
    66. List0.head = recurMerge(node1, node2)
    67. List0.travel()
    68. List1.travel()
    69. List2.travel()
    70. //不使用副本的对比
    71. node1 = List1.head
    72. node2 = List2.head
    73. List0 = &List{}
    74. List0.head = recurMerge(node1, node2)
    75. List0.travel()
    76. List1.travel()
    77. List2.travel()
    78. //另一组合并
    79. List1 = &List{}
    80. List2 = &List{}
    81. List1.build([]int{0, 2, 4, 8})
    82. List2.build([]int{1, 3, 5, 7, 9})
    83. node1 = List1.Copy().head
    84. node2 = List2.Copy().head
    85. List0 = &List{}
    86. List0.head = recurMerge(node1, node2)
    87. List0.travel()
    88. List1.travel()
    89. List2.travel()
    90. }
    91. /*输出:
    92. 1->1->2->3->3->4->5->5->8
    93. 1->2->4->8
    94. 1->3->3->5->5
    95. 1->1->2->3->3->4->5->5->8
    96. 1->2->3->3->4->5->5->8
    97. 1->1->2->3->3->4->5->5->8
    98. 0->1->2->3->4->5->7->8->9
    99. 0->2->4->8
    100. 1->3->5->7->9
    101. */

    本例中链表类的next指针改名为head:

    type List struct {
        head *Node

    2、常规遍历:

    1. package main
    2. import "fmt"
    3. type Node struct {
    4. data int
    5. next *Node
    6. }
    7. type List struct {
    8. head *Node
    9. }
    10. func mergeLists(list1 *List, list2 *List) *List {
    11. list := &List{&Node{}} //初始赋值时多余一个默认值0
    12. p := list.head
    13. p1 := list1.Copy().head //使用副本保留链表原样
    14. p2 := list2.Copy().head
    15. for ; p1 != nil && p2 != nil; p = p.next {
    16. if p1.data < p2.data {
    17. p.next = p1
    18. p1 = p1.next
    19. } else {
    20. p.next = p2
    21. p2 = p2.next
    22. }
    23. }
    24. if p1 == nil {
    25. p.next = p2
    26. } else if p2 == nil {
    27. p.next = p1
    28. }
    29. list.head = list.head.next //去掉初始化时的0值
    30. return list
    31. }
    32. func (list *List) build(lst []int) {
    33. for i := len(lst) - 1; i >= 0; i-- {
    34. node := &Node{data: lst[i]}
    35. node.next = list.head
    36. list.head = node
    37. }
    38. }
    39. func (list *List) Copy() *List {
    40. p := list.head
    41. res := &List{}
    42. if p != nil {
    43. node := &Node{p.data, nil}
    44. q := node
    45. for p = p.next; p != nil; p = p.next {
    46. q.next = &Node{p.data, nil}
    47. q = q.next
    48. }
    49. res.head = node
    50. }
    51. return res
    52. }
    53. func (list *List) travel() {
    54. for p := list.head; p != nil; p = p.next {
    55. fmt.Print(p.data)
    56. if p.next != nil {
    57. fmt.Print("->")
    58. }
    59. }
    60. fmt.Println("")
    61. }
    62. func main() {
    63. List1 := &List{}
    64. List2 := &List{}
    65. List1.build([]int{1, 2, 4, 8})
    66. List2.build([]int{1, 3, 3, 5, 5})
    67. List0 := mergeLists(List1, List2)
    68. List0.travel()
    69. List1.travel()
    70. List2.travel()
    71. List1 = &List{}
    72. List2 = &List{}
    73. List1.build([]int{0, 2, 4, 8})
    74. List2.build([]int{1, 3, 5, 7, 9})
    75. List0 = mergeLists(List1, List2)
    76. List0.travel()
    77. List1.travel()
    78. List2.travel()
    79. }
    80. /*输出:
    81. 1->1->2->3->3->4->5->5->8
    82. 1->2->4->8
    83. 1->3->3->5->5
    84. 0->1->2->3->4->5->7->8->9
    85. 0->2->4->8
    86. 1->3->5->7->9
    87. */

  • 相关阅读:
    JavaWeb、终章案例
    KeyDB源码解析二——线程安全
    WEB前端网页设计 HTML CSS 网页设计参数 - 【盒子模型】
    谷粒商城 高级篇 (十七) --------- 单点登录
    PyTorch深度学习基础之Tensor对象及其应用的讲解及实战(附源码 简单易懂 包括分段 映射 矩阵乘法 随机数等等)
    一篇文章带你搞定Java封装
    HBase 常见问题总结(一)
    LM小型可编程控制器软件(基于CoDeSys)笔记十七:pto脉冲功能块
    gazebo中vins-fusion在仿真小车上的部署
    初识C语言
  • 原文地址:https://blog.csdn.net/boysoft2002/article/details/126450718