当前位置:   article > 正文

Day3 Golang (链表) 203.移除链表元素 707.设计链表 206.反转链表_go语言var prev *listnode和pre := &listnode{}的区别

go语言var prev *listnode和pre := &listnode{}的区别
  1. // 01 203.移除链表元素
  2. package main
  3. import "fmt"
  4. //Definition for singly-linked list.定义链表的结构
  5. type ListNode struct {
  6. Val int
  7. Next *ListNode
  8. }
  9. func removeElements(head *ListNode, val int) *ListNode {
  10. dummyhead := new(ListNode) //定义一个虚拟头结点
  11. dummyhead.Next = head //虚拟头结点指向链表的头结点
  12. cur := dummyhead //定义临时指针用来遍历链表
  13. for cur.Next != nil { /下一个结点指针也不为空,由于需要cur.Next.Next
  14. if cur.Next.Val == val {
  15. cur.Next = cur.Next.Next
  16. } else {
  17. cur = cur.Next
  18. }
  19. }
  20. return dummyhead.Next //注意这里返回虚拟头结点的下一个结点,因为头结点可能会被删除
  21. }
  22. func printList(cur *ListNode) { //打印链表元素
  23. for cur != nil {
  24. fmt.Printf("%v ", cur.Val)
  25. cur = cur.Next
  26. }
  27. fmt.Println("")
  28. }
  29. func main() {
  30. node1, node2, node3 := new(ListNode), new(ListNode), new(ListNode)
  31. node4, node5, node6, node7 := new(ListNode), new(ListNode), new(ListNode), new(ListNode)
  32. //结点1-3
  33. node1.Val, node2.Val, node3.Val = 1, 2, 6
  34. node1.Next, node2.Next, node3.Next = node2, node3, node4
  35. //结点4-7
  36. node4.Val, node5.Val, node6.Val, node7.Val = 3, 4, 5, 6
  37. node4.Next, node5.Next, node6.Next, node7.Next = node5, node6, node7, nil
  38. cur := node1 //cur用来遍历链表
  39. printList(cur)
  40. res := removeElements(node1, 6) //移除链表元素
  41. printList(res)
  42. }

 注意:

1.初始化链表的方法 dummyhead : = &ListNode{Val:val} 或 dummyhead : =new(ListNode)

2.返回值为 dummy.Next 不是 head

3.删除头结点时用 for 而不是 if,避免出现[1,1,1,1,1] 只删除一个结点的情况

4.因为要对 cur.next.next 操作,须先判断 cur.next 不为空

  1. // 02 707.设计链表
  2. package main
  3. import (
  4. "fmt"
  5. )
  6. type SingleNode struct {
  7. Val int
  8. Next *SingleNode
  9. }
  10. type MyLinkedList struct {
  11. Dummyhead *SingleNode //链表头结点的地址
  12. Size int //链表的长度
  13. }
  14. func Constructor() MyLinkedList {
  15. node := &SingleNode{0, nil} //定义一个虚拟头结点
  16. return MyLinkedList{node, 0}
  17. }
  18. func (this *MyLinkedList) Get(index int) int {
  19. if index < 0 || index > this.Size-1 { //注意提前判断index是否合法
  20. return -1
  21. }
  22. cur := this.Dummyhead
  23. for index > 0 {
  24. cur = cur.Next
  25. index--
  26. }
  27. return cur.Next.Val
  28. }
  29. func (this *MyLinkedList) AddAtHead(val int) {
  30. cur := this.Dummyhead
  31. newnode := &SingleNode{val, nil}
  32. newnode.Next = cur.Next
  33. cur.Next = newnode
  34. this.Size++
  35. }
  36. func (this *MyLinkedList) AddAtTail(val int) {
  37. cur := this.Dummyhead
  38. newnode := &SingleNode{val, nil}
  39. for cur.Next != nil {
  40. cur = cur.Next
  41. }
  42. cur.Next = newnode
  43. this.Size++
  44. }
  45. func (this *MyLinkedList) AddAtIndex(index int, val int) {
  46. if index < 0 || index > this.Size { //注意提前判断index是否合法,这里index可以等于this.Size
  47. return
  48. }
  49. cur := this.Dummyhead
  50. newnode := &SingleNode{val, nil}
  51. for index > 0 {
  52. cur = cur.Next
  53. index--
  54. }
  55. newnode.Next = cur.Next
  56. cur.Next = newnode
  57. this.Size++
  58. }
  59. func (this *MyLinkedList) DeleteAtIndex(index int) {
  60. if index < 0 || index > this.Size-1 { //注意提前判断index是否合法
  61. return
  62. }
  63. cur := this.Dummyhead
  64. for index > 0 {
  65. cur = cur.Next
  66. index--
  67. }
  68. cur.Next = cur.Next.Next
  69. this.Size--
  70. }
  71. func printList(cur *SingleNode) { //打印链表元素
  72. for cur != nil {
  73. fmt.Printf("%v ", cur.Val)
  74. cur = cur.Next
  75. }
  76. fmt.Println("")
  77. }
  78. func main() {
  79. list := Constructor()
  80. list.AddAtHead(100)
  81. list.AddAtHead(200)
  82. list.AddAtHead(300)
  83. printList(list.Dummyhead.Next) //头插法:初始化一个链表 300 200 100
  84. list.AddAtHead(1) //在头结点后插入元素
  85. printList(list.Dummyhead.Next) //1 300 200 100
  86. list.AddAtTail(3) //在尾结点后插入元素
  87. printList(list.Dummyhead.Next) //1 300 200 100 3
  88. list.AddAtIndex(1, 5) //在索引为1的结点前插入元素,索引从0开始
  89. printList(list.Dummyhead.Next) //1 5 300 200 100 3
  90. list.DeleteAtIndex(3) //删除索引为3的元素
  91. printList(list.Dummyhead.Next) //1 5 300 100 3
  92. res := list.Get(4) //获取索引值为4的元素
  93. fmt.Printf("res: %v\n", res) //res: 3
  94. }
  1. // 03 206.反转链表
  2. package main
  3. import "fmt"
  4. type ListNode struct {
  5. Val int
  6. Next *ListNode
  7. }
  8. func printList(cur *ListNode) { //打印链表元素
  9. for cur != nil {
  10. fmt.Printf("%v ", cur.Val)
  11. cur = cur.Next
  12. }
  13. fmt.Println("")
  14. }
  15. func reverseList(head *ListNode) *ListNode {
  16. var pre *ListNode //重点:定义一个指向链表的空指针
  17. cur := head
  18. for cur != nil { //cur指向kong循环结束
  19. temp := cur.Next //保存cur下一个结点的地址
  20. cur.Next = pre //反转链表
  21. pre = cur //先移动pre
  22. cur = temp //再移动cur
  23. }
  24. return pre
  25. }
  26. func main() {
  27. node1, node2, node3 := new(ListNode), new(ListNode), new(ListNode)
  28. node4, node5, node6, node7 := new(ListNode), new(ListNode), new(ListNode), new(ListNode)
  29. //结点1-3
  30. node1.Val, node2.Val, node3.Val = 1, 2, 6
  31. node1.Next, node2.Next, node3.Next = node2, node3, node4
  32. //结点4-7
  33. node4.Val, node5.Val, node6.Val, node7.Val = 3, 4, 5, 6
  34. node4.Next, node5.Next, node6.Next, node7.Next = node5, node6, node7, nil
  35. cur := node1 //cur用来遍历链表
  36. printList(cur) //1 2 6 3 4 5 6
  37. res := reverseList(node1)
  38. printList(res) //6 5 4 3 6 2 1
  39. }

注意:

1.这里初始化 pre 空指针类型 var pre*ListNode,不能初始化为结点(错误写法pre:=new(ListNode))

2. 首先用 temp 保存 cur.Next,再翻转链表 cur.Next 指向 pre,然后先让 pre 指向 cur,再让 cur 指向 temp 保存的值。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/850444
推荐阅读
相关标签
  

闽ICP备14008679号