leetcode19删除链表的倒数第N个节点

leetcode19 Remove Nth Node From End of List

Posted by BY on May 16, 2019

前言

新的一年,好好学习。

正文

问题来源

本问题来自leetcode上的19题。

问题描述

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例 1:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

分析:

空间换时间

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeNthFromEnd(head *ListNode, n int) *ListNode {
    stack := make([]*ListNode, 0)
    for head != nil {
        stack = append(stack, head)
        head = head.Next
    }
    l := len(stack)
    if l == n {
        if l == 1 {
            return nil
        }
        return stack[1]
    } else {
        stack[l-n-1].Next = stack[l-n].Next
        return stack[0]
    }
}

别人的答案

/**
     * 本质上,倒数第n个,只需要设置两个指针,一个走得快,一个走得慢
     * 走得快的比走的慢的多走n步就可以,当走的快的到了尾巴,那么也到了倒数第n个的位置了
     * 
     * 这题只需要注意初始的边界调节,比如只有一个且删除第一个怎么办,我是采用多创建了指针,指在头结点之前就好
     * */
func removeNthFromEnd(head *ListNode, n int) *ListNode {
    if n<=0 || head == nil {
        return head
    }
    
    fast := head
    for i:=1; i<=n && fast!=nil; i++ {
        fast = fast.Next
    }
    
    if fast == nil {
        return head.Next
    }
    
    slow := head
    for fast.Next != nil {
        slow = slow.Next
        fast = fast.Next
    }
    slow.Next = slow.Next.Next
    return head
}

总结:

勤思考。

结语

不管怎么样好好加油。