Leetcode之Remove Nth Node From End of List 问题

问题描述:

Given a linked list, remove the nth node from the end of list (倒数第n个结点)and return its head.

Note:
Given n will always be valid.
Try to do this in one pass.

示例:

Given linked list: 1->2->3->4->5, and n = 2.

 After removing the second node from the end, the linked list becomes 1->2->3->5.

题目来源Remove Nth Node From End of List (详细地址:https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/)

思路分析:

      解法一:先考虑加上dummy结点的解法:我们利用两个指针一个fast,一个slow,我们先让fast指针走n+1步,使得两个指针之间间隔n个数。可能有人会想?为什么我们要先走n+1步,而不是n步或者是别的步数呢?仔细想想,我们让两指针之间间隔n个数,当fast最后走完最后一个数出去的时候,最后我们的slow指针在哪?是不是停在了倒数第n+1个数,因为它们之间间隔n个数,最后slow不就在n+1个数了吗?接着,又有人问为什么slow要停在倒数第n+1个数呢?我们删除的是倒数第n个数吗不是?当前要停在它前面的数才能删除掉倒数第n个数啊。可能绕晕了不少人了,那下面我们就讲个例子辅助大家理解:

      链表为:1->2->3->4->5,我们现在删除倒数第2个数,加上一个dummy结点,我们就相当于是0->1->2->3->4->5,我们先让fast移动到3这个结点,接着我们同时启动slow和fast两个指针,当fast跑完了最后一个结点要出去了,此时slow结点停留在3这个结点,此时我们就可以删除了。

     解法二:咱们现在再来考虑下不加dummy结点的情况,如果按照上面的方法走的话,我们就会出现很多的空指针异常。那现在我们该咋走呢?我们先让fast走n步,注意现在不是n+1步了,因为我们现在控制的是走到最后一个节点而不走出去了。当fast走到最后一个节点的时候,slow指针是不就停在了倒数第n+1个节点了?因为fast只是领先了n步嘛,再拿上面的例子就是:当fast走到5的时候,slow就停在了3的位置了。在这,我们需要考虑一下空指针的问题:就是当前面走的n步,fast等于空怎么办?我们就让head = head.next,例如:1->2,n=2,结果head就是2了,因为删除了倒数第二个数1了。

     可能马上就有人问了,为啥上面的不需要考虑这种情况呢?个人的理解没有添加dummy结点的解法中,fast是只会到最后一个节点的,因为判断条件是fast!=null,如果解法二仍然是这样的话,当fast跑出去之后,所以slow.next.next就会可能会出现空指针异常了,当然前面我们也需要判断fast==null的情况,上面也讲了,需要调整head指针。

代码:

解法一(多了个dummy结点的解法):

Leetcode之Remove Nth Node From End of List 问题

解法二(多了几个判断条件的解法):

Leetcode之Remove Nth Node From End of List 问题

体会:空指针异常应该是java里面最常见的异常了,处理起来非常头疼,需要冷静思考多加判断。