题目描述:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
题目解析:
首先题目中说明了n保证有效,因此我们不需要考虑n越界等情况,但是出于完整思路我们还是要想到这一点。还有重要的一点是这个题目要求一次遍历解决问题,所以不能用一次完整的遍历来统计链表中元素的个数然后删除倒数第n个节点,而是遍历到倒数第n个节点就应该删除,这里有一个巧妙的方法,举个例子,想象一下我们有一把标尺长度为n,用它来在线型的链表上卡尺,从链表头开始向后移动,当标尺的右端到达链表尾部时,此时的标尺的左端也就到达了倒数第n个节点位置,OK,思想讲清楚了,我们饿只需要模拟这个场景即可,这里我们定义两个指针,分别指向卡尺的两端,然后移动即可,代码如下:
ListNode* RemoveListNodeFromEnd::removeNthFromEnd(ListNode* head, int n)
{
if (!head || !head->next) return nullptr;//排除特殊临界情况