给一个单向链表,输入一个n,删掉从后往前第n个元素。尽可能一次遍历单链表。
两个指针,使他们的差距刚好为n, 当后面一个刚好指向NULL的时候,删掉前一个即可。
附上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Solution {
public:
ListNode *removeNthFromEnd(ListNode *head, int n) {
ListNode *before = NULL;
ListNode *p1 = head;
ListNode *p2 = head;
if(n <= 0) return head;
for(int i = 0; i < n; i++) {
p2 = p2->next;
}
while(p2 != NULL) {
p2 = p2->next;
before = p1;
p1 = p1->next;
}
if(before == NULL) {
return head->next;
} else {
before->next = p1->next;
return head;
}
}
};
|