LeetCode 19 Remove Nth Node From End of List

Remove Nth Node From End of List

O(n)复杂度

1.新建一个头节点作为虚拟头部,这样在删除过程中就不需要考虑一些特殊的情况(删除的就是第一个节点)
2.用两个指针p和q,当p已经走了n步的时候,在让pq都同时往后走,当p走到头为NULL的时候,q指向的就是倒数第n个数,过程中记录父亲节点,直接修改指针即可
 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* removeNthFromEnd(ListNode* head, int n) {
12         ListNode *p, *q,*pre;
13         ListNode * node = new ListNode(0); //增加一个虚拟的头节点
14         node->next = head;
15         pre = node;
16         p = q = head;
17         if(head==NULL) return NULL;
18         int i=0;
19         //这里加一个头节点方便理解,方便删除
20         //用两个指针p和q,当p已经走了n步的时候,在让pq都同时往后走,当p走到头为NULL的时候,q指向的就是倒数第n个数
21         //过程中记录父亲节点,直接修改指针即可
22         while(p!=NULL){
23             if(i>=n){
24                 pre = q;
25                 q= q->next;
26             }
27             i++;
28             p=p->next;
29         }
30         pre->next = q->next;
31         free(q);
32         return node->next;
33     }
34 };

 

posted @ 2015-12-04 17:34  Acker  阅读(102)  评论(0编辑  收藏  举报