给你一个链表,删除链表的倒数第 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为空的情况。
代码:
答案解答:
双指针法:首先用一个快指针走n个结点,然后慢指针和快指针一起走,直到快指针走为null。举个例子: 有一个链表1->2->3->4->5;现在要找到倒数第二个数:
快指针走两个到2的位置,接下来如果需要走到末尾,还需要走4个位置,这样慢指针也走4个,到大4,也就是倒数第二个位置。
那么想要找到要删除的结点的前一个,只需要让快指针多走一个即可。
代码: