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

👍解题思路:
这道算法题属于链表的操作题,还是接回上一篇博客所说道:需要操作该结点,必须要找到该结点的上一个结点。这一道题需要用到双指针中的快慢指针:我们还是需要创建一个虚拟头结点(dummyHead),删除第n个结点先让fast比slow先多走n+1步。
为什么是走n+1呢?
原因:因为我们创建了一个虚拟头结点(dummyHead),并且有一个前提是,需要操作该结点,必须要找到该结点的上一个结点。因此,要想双指针同时移动时slow指针走向目标结点的上一个结点,fast指针必须要走n+1步。下图:红色框的就是要删除的结点。

题目为删除倒数第n个结点,设n=2时,则需删除结点3。fast需要先走3步。
代码如下:
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyHead = new ListNode(-1); //创建一个虚拟头结点
dummyHead.next=head; //使虚拟头结点的next指向真实头结点
ListNode fastIndex=dummyHead; //设一个快指针并赋值为虚拟头结点
ListNode slowIndex=dummyHead; //设一个慢结点并赋值为虚拟头结点
//让快指针先走n+1步
for (int i = 0; i <=n; i++) {
fastIndex=fastIndex.next;
}
//使得快慢指针同时前进
while (fastIndex!=null){
fastIndex=fastIndex.next;
slowIndex=slowIndex.next;
}
//进行删除目标结点的操作
if (slowIndex.next!=null){
slowIndex.next=slowIndex.next.next;
}
return dummyHead.next; //返回头结点
}


被折叠的 条评论
为什么被折叠?



