考察点:链表,指针;
思路:过滤掉特殊情况,然后是通用情况;
C++ 代码:
/**
* 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) return head;
if (head->next == NULL && n == 1)
return NULL;
int len = 0;
ListNode * temp_len = head;
while (temp_len){
len++;
temp_len = temp_len->next;
}
if (n >=len) {
temp_len = head->next;
free(head);
return temp_len;
}// 长度等于n的情况
int i=0;
ListNode * after = head;
ListNode * before = head;
while (after->next) {
i++;
if (i == n) {
before = head;
}
if (i > n) {
before = before->next;
}
after = after->next;
}
ListNode * temp = before->next;
before->next = temp->next;
free(temp);
return head;
}
};
discuss中的奇淫技巧:
代码:
class Solution
{
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
ListNode** t1 = &head, *t2 = head;
for(int i = 1; i < n; ++i)
{
t2 = t2->next;
}
while(t2->next != NULL)
{
t1 = &((*t1)->next);
t2 = t2->next;
}
*t1 = (*t1)->next;
return head;
}
};