题目:删除倒数第n个节点,最后的返回为head
解题思路:
想在一次遍历的情况下对相应的节点进行删除,可以考虑两个指针,两个指针的距离恰好为n,这样就能在一次遍历的情况下删除对应的节点。
注意:要考虑边界情况,即删除的节点是链表的第一个节点或者最后一个节点。由于要确定删除第一个节点实现和所有的其他情况统一化,我们在链表的头部添加一个前置的节点,具体的实现如下:
实现
/**
* 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 *pre = new ListNode(0);
pre->next = head;
ListNode *p = pre;
ListNode *q = pre;
for(int i = 0; i < n; i++) {
p = p->next;
}
while(p->next != NULL) {
p = p->next;
q = q->next;
}
ListNode *k = q->next;
if(k == head) {
head = head->next;
delete k;
return head;
}
q->next = k->next;
delete k;
return head;
}
};
知识点:
1、删除一个节点的关键是找到该节点的前向节点
2、头节点没有前向节点,就人为的添加一个前向的节点,这样可以使处理所有的情况实现统一,而不用因处理特殊情况引入复杂的开销。