LeetCode 19. Remove Nth Node From End of List
链表题。很简单但是debug了非常久。
愚蠢如我...把所有地址存在数组里。空间复杂度...
/** * 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 *p=head,*q; ListNode *s[100000]; int m=0; while(p){ s[m]=p;m++; p=p->next; } if (m==n) return head->next; if(n==1) (*s[m-2]).next=NULL; else { p=s[m-n-1]; q=p->next; (*p).next=(*q).next; } return head; } };
非常巧妙的方法,保持两个指针差n个位置,使后面的指针指向最后一个,前面的指针即为倒数第n.
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { if(!head->next) return NULL; ListNode *pre = head; ListNode *cur = head; for(int i = 0;i<n;i++) cur = cur->next; if(!cur) return head->next; while(cur->next){ cur = cur->next; pre = pre->next; } pre->next = pre->next->next; return head; } };