力扣 19题 删除链表的倒数第N个结点

68 阅读1分钟

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

 

示例 1:

输入: head = [1,2,3,4,5], n = 2
输出: [1,2,3,5]

示例 2:

输入: head = [1], n = 1
输出: []

示例 3:

输入: head = [1,2], n = 1
输出: [1]

个人思路:首先用循环获得所有结点的个数i。然后设置虚节点 以及虚节点所在的k值为0;如果i-k==n,也就是所要删除的结点的前一个结点。但是在删除时也有两种情况:1.当前结点的下一个和下两个结点都不为空,这种就需要将currentNode.next = currentNode.next.next;2.当前结点的下一个结点不为空,下下个结点为空,这种情况只需要将currentNode.next=null即可。

在分析的时候可以看到:如果要删除最后一个结点,也就是倒数第一个,我们会找到该结点的前一个结点,所以并不存在currentNode.next为空的情况。

代码:

image.png image.png

答案解答:

双指针法:首先用一个快指针走n个结点,然后慢指针和快指针一起走,直到快指针走为null。举个例子: 有一个链表1->2->3->4->5;现在要找到倒数第二个数:

快指针走两个到2的位置,接下来如果需要走到末尾,还需要走4个位置,这样慢指针也走4个,到大4,也就是倒数第二个位置。

那么想要找到要删除的结点的前一个,只需要让快指针多走一个即可。

代码:

image.png