Leetcode 刷题 第五天 – 876. 链表的中间结点,19. 删除链表的倒数第 N 个结点

Spread the love

876. 链表的中间结点

解题思路,双指针,快慢指针,快慢指针只差一个值

func middleNode(head *ListNode) *ListNode {
    slow := head;
    fast := head;
    for fast != nil && fast.Next != nil {
        slow = slow.Next;
        fast = fast.Next.Next;
    }
    return slow;
}

19. 删除链表的倒数第 N 个结点

解题思路:双指针,通过(长度 – 要删除的位置)的前n个元素的要删除的这个元素的前一个节点,根据前一个节点的后一个的后一个,为要删除的节点的后面元素得剩余数组

func removeNthFromEnd(head *ListNode, n int) *ListNode {
    lenN := getNodesLen(head)
    // fmt.Println(lenN)
    dummy := &ListNode{0, head}
    cur := dummy
    for i:=0; i < lenN - n; i+=1 {
        cur = cur.Next
    } 
    // if cur.Next != nil {
        cur.Next = cur.Next.Next
    // } else {
    //     head = nil
    // }
    return dummy.Next
}

func getNodesLen(head *ListNode) int {
    n:=0
    for ; head !=nil; head = head.Next {
        n+=1
    }
    return n
}