一:问题描述
删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
二:问题分析
基本思路是使用两个快慢指针,让快指针先走n+1步后,再让快慢指针一起移动,直到快指针指向链表结尾null,此时慢指针应该指向倒数第n+1个节点,最后让慢指针指向慢指针的下下个节点,至此算法完成。
特殊技巧:添加一个哑节点dummy,使其开始指向链表头部,为简化一些特殊情况:例如列表中只含有一个节点或删除列表头部节点。
三:问题求解
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//定义一个哑节点
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode slow=dummy;
ListNode fast=dummy;
//让快指针先走n+1步
for(int i=0;i<=n;i++){
fast=fast.next;
}
//快慢指针一起走
while(fast!=null){
slow=slow.next;
fast=fast.next;
}
slow.next=slow.next.next;
//返回哑节点的下个节点,比起直接返回头部,这种方法可以更方便的解决许多特殊情况
return dummy.next;
}
}
总结:通过这道题,学会了使用一个哑节点来进行特殊情况的规避,在以后的算法题中要更加注重特殊情况的考虑!!!