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 };