题目描述(难度中)
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
链接
https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
思路
用一前一后两个指针,第一个指针先跑n
个node
,第二个指针再从头跑,第一个指针跑到结尾时,第二个指针指向的node
即为要删除的node
。
注意:
1、输入的链表没有n
个node
时,返回NULL
2、要删除的node
是第一个node
时,返回为head->next
,这种情况需要特判
3、需要用一个指针记录指向要删除node
的上一个node
代码
代码没有释放p2
指向的内存空间,因为使用delete
和free
都会编译出错,实际操作中是需要释放的。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* p1 = head;
ListNode* p2 = head;
ListNode* p2pre = head;
// p1 先向前跑n下
while(n--){
if(p1){
p1 = p1->next;
}
else{
return NULL;
}
}
// 删除的是第一个node时的特判
if(p1 == NULL){
return head->next;
}
while(p1){
p1 = p1->next;
p2pre = p2;
p2 = p2->next;
}
p2pre->next = p2->next;
return head;
}
};