image.png

反转链表-精简实现

  1. func reverseList(head *ListNode) *ListNode {
  2. var cur, prev *ListNode = head, nil
  3. for cur != nil {
  4. cur.Next, prev, cur = prev, cur, cur.Next
  5. }
  6. return prev
  7. }

图解:

反转链表精简写法原理.png

两两交换链表节点-精简实现

  1. func swapPairs(head *ListNode) *ListNode {
  2. prev := &ListNode{Next:head}
  3. newHead := prev
  4. for prev.Next != nil && prev.Next.Next != nil {
  5. a := prev.Next
  6. b := a.Next
  7. prev.Next, b.Next, a.Next =b, a, b.Next
  8. prev = a
  9. }
  10. return newHead.Next
  11. }

检测链表是否有环

解法:

  • 一直遍历, 如果超时则有环
  • 利用 map 记录访问过的节点
  • 快慢指针

快慢指针解法:

  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func hasCycle(head *ListNode) bool {
  9. slow, fast := head, head
  10. for slow != nil && fast != nil && fast.Next != nil {
  11. slow = slow.Next
  12. fast = fast.Next.Next
  13. if slow == fast {
  14. return true
  15. }
  16. }
  17. return false
  18. }