本文共 1059 字,大约阅读时间需要 3 分钟。
这个题的思路其实非常简单,就用快慢指针,在一次遍历中,使快指针与慢指针之间的距离为n。但是实现过程确实充满波折,怀疑人生,还需要多加练习。思考及遇到的几个问题:
1、慢指针最终指向待删除元素还是其上一个元素?如果我们将慢指针指向删除元素,那么如何将其上一个节点的指针域指向其下一个节点,达到将其删除的目的。所以,我们应该将慢指针最终指向待删除元素的上一个元素。
2、特例情况?在n小于链表长度时,上述过程其实是非常容易实现的。但是在第一个例子就出Bug了([1], 1)链表只有一个元素,那么如何指向其上面一个元素?所以我们增加一个头结点使其指向链表的第一个元素。
3、返回什么元素?最开始想法是既然删除了节点,直接返回head即可。然而对于上述特例情况,此时head已经被删除了。所以我们返回头结点的下一个节点指向地址。
解题代码:/** * 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 *left,*right; ListNode *Head = new ListNode(0); Head->next = head; left = right = Head; for(int i=0;i<=n;i++){ right=right->next; } while(right!=nullptr){ right = right->next; left = left->next; } ListNode *temp; temp=left->next; left->next=temp->next; delete temp; return Head->next; delete Head; }};
转载地址:http://npyci.baihongyu.com/