链表反转

  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func reverseList(head *ListNode) *ListNode {
  9. cur := head
  10. var pre *ListNode
  11. for cur != nil {
  12. tmp := cur.Next
  13. cur.Next = pre // 当前节点指向上一个节点
  14. pre = cur // 进行下一轮
  15. cur = tmp
  16. }
  17. return pre
  18. }

两数相加

  1. func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
  2. var node *ListNode
  3. flag := false
  4. for l1 != nil && l2 != nil {
  5. val := l1.Val + l2.Val
  6. if flag {
  7. val++
  8. flag = false
  9. }
  10. if val > 9 {
  11. val = val % 10
  12. flag = true
  13. }
  14. newNode := new(ListNode)
  15. newNode.Val = val
  16. if node == nil {
  17. node = newNode
  18. } else {
  19. cur := node
  20. pre := node
  21. for cur != nil {
  22. pre = cur
  23. cur = cur.Next
  24. }
  25. pre.Next = newNode
  26. }
  27. l1, l2 = l1.Next, l2.Next
  28. }
  29. for l1 != nil {
  30. if flag {
  31. l1.Val++
  32. flag = false
  33. }
  34. if l1.Val > 9 {
  35. l1.Val = l1.Val % 10
  36. flag = true
  37. }
  38. newNode := new(ListNode)
  39. newNode.Val = l1.Val
  40. cur := node
  41. pre := node
  42. for cur != nil {
  43. pre = cur
  44. cur = cur.Next
  45. }
  46. pre.Next = newNode
  47. l1 = l1.Next
  48. }
  49. for l2 != nil {
  50. if flag {
  51. l2.Val++
  52. flag = false
  53. }
  54. if l2.Val > 9 {
  55. l2.Val = l2.Val % 10
  56. flag = true
  57. }
  58. newNode := new(ListNode)
  59. newNode.Val = l2.Val
  60. cur := node
  61. pre := node
  62. for cur != nil {
  63. pre = cur
  64. cur = cur.Next
  65. }
  66. pre.Next = newNode
  67. l2 = l2.Next
  68. }
  69. if flag {
  70. newNode := new(ListNode)
  71. newNode.Val = 1
  72. cur := node
  73. pre := node
  74. for cur != nil {
  75. pre = cur
  76. cur = cur.Next
  77. }
  78. pre.Next = newNode
  79. }
  80. return node
  81. }

删除链表的倒数第n个节点

  1. func removeNthFromEnd(head *ListNode, n int) *ListNode {
  2. s := make([]*ListNode, 0)
  3. h := head
  4. for h != nil {
  5. s = append(s, h)
  6. h = h.Next
  7. }
  8. node := s[len(s)-n]
  9. // 删除的节点是头部的情况
  10. if len(s)-n == 0 {
  11. head = head.Next
  12. return head
  13. }
  14. // 删除找到的节点
  15. pre := head
  16. cur := head.Next
  17. for cur != nil {
  18. if cur == node {
  19. pre.Next = cur.Next
  20. break
  21. } else {
  22. pre = cur
  23. cur = cur.Next
  24. }
  25. }
  26. return head
  27. }