代码随想录第四天|24两两交换链表节点19删除链表倒数第n0207链表相交142环形链表II|01笔记

67 阅读1分钟
  • 24 两两交换表中的结点

  • 代码随想录 (programmercarl.com)
  • 第一印象

  • 主要是处理两两交换的节点以及交换后结点和后面结点相连是逻辑(最开始遗漏了交换后结点与前面结点的衔接问题,因此也造成了之后解题错误)
  • 讲解观后感

  • 以十分详细的图示解析了指针的变化过程,并再次体现了虚拟头结点的便利
  • 遇到问题

  • image.png
  • 错误代码:
  •     func reverseList(head *ListNode) *ListNode {
            dummy := &ListNode{
                Val:0,
                Next:head,
            }
            pre := dummy
            cur := head
            for cur.Next != nil {
                next := cur.Next
                cur.Next = pre
                pre = cur
                cur = next
            } 
            head.Next = nil
            return cur
        }
    
  • 判定条件选择错误造成的溢出问题
  • 解题代码

  •     func reverseList(head *ListNode) *ListNode {
            var pre *ListNode 
            cur := head
            for cur != nil {
                next := cur.Next
                cur.Next = pre
                pre = cur
                cur = next
            } 
            return pre
        }
    
  • 19删除倒数第N个节点

  • 代码随想录 (programmercarl.com)
  • 第一印象

  • 主要是利用快慢两个指针,确定间距,然后同时向后至快指针达到链表末尾。
  • 解题代码

  •     /**
         * Definition for singly-linked list.
         * type ListNode struct {
         *     Val int
         *     Next *ListNode
         * }
         */
        func removeNthFromEnd(head *ListNode, n int) *ListNode {
            dummyNode := &ListNode{
                Next:head,
            }
            fast := head
            for i:=0;i<n;i++ {
                fast = fast.Next
            } 
            slow := dummyNode
            for fast!=nil {
                fast = fast.Next
                slow = slow.Next
            }
        
            slow.Next = slow.Next.Next
            return dummyNode.Next
            
        }
    
  • 0207链表相交

  • 代码随想录 (programmercarl.com)
  • 第一印象

  • 先各自确定链表的长度,然后将指针分别指向较长链表走过差值的结点和较短链表的头部。同时向后直至末尾或指向同一结点
  • 解题代码

  •     /**
         * Definition for singly-linked list.
         * type ListNode struct {
         *     Val int
         *     Next *ListNode
         * }
         */
        func getIntersectionNode(headA, headB *ListNode) *ListNode {
           sizeA :=0
           sizeB :=0
           A := headA
           B := headB
           for A!=nil {
               sizeA++
               A = A.Next
           } 
           for B!=nil {
               sizeB++
               B = B.Next
           }
           if sizeA > sizeB {
               diff := sizeA - sizeB
               for i:=0;i<diff;i++ {
                   headA = headA.Next
               }
               for headA!=nil {
                   if headA==headB {
                       return headA
                   }
                   headA = headA.Next
                   headB = headB.Next
               }
               return nil
           } else {
               dif := sizeB - sizeA
               for i:=0;i<dif;i++ {
                   headB = headB.Next
               }
               for headB!=nil {
                   if headA==headB {
                       return headB
                   }
                   headA = headA.Next
                   headB = headB.Next
               }
               return nil
           }
        }
    
  • 142环形链表

  • 代码随想录 (programmercarl.com)
  • 第一印象

  • 主要是利用快慢指针寻找相遇点。然后再通过模型关系找到环形进入点。
  • 解题代码

  •     /**
         * Definition for singly-linked list.
         * type ListNode struct {
         *     Val int
         *     Next *ListNode
         * }
         */
        func detectCycle(head *ListNode) *ListNode {
            slow := head
            fast := head
            for slow!=nil&&fast!=nil&&fast.Next!=nil {
                slow = slow.Next
                fast = fast.Next.Next
                if fast == slow {
                    for head!=slow {
                    head = head.Next
                    slow = slow.Next
                } 
                return head
                }
            }
            return nil
        }