思路:设置两个指针,其中第二个指针比第一个延迟n个元素,这样,当第二个指针遍历到指针尾部时,对第一个指针进行删除操作。
当然,这题要注意一些边界值,比如输入[1,2] n=2时如果按照思路走会指向未分配的内存空间,要加一个条件判断。
/** * 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) { if(head->next == NULL && n == 1) return NULL; if(n == 0) return head; ListNode* p = head; ListNode* q = head; for (int i = 0; i < n; i++) p = p->next; int sum = 0; while(p != NULL && p->next != NULL) { p = p->next; q = q->next; sum++; } if(sum == 0 && p == NULL) return q->next; q->next = q->next->next; return head; delete p; delete q; delete head; } };