2020/3/22,今天又巩固了一下自己的链表知识。题意如下:
最简单的思路就是O(N2)循环两次找,但是我们能不能O(N)实现呢?思考一下我们需要循环两次的原因是链表只能向后查找,并不知道什么时候到达尾结点。那么换个思路,我们可以使用两个指针,一个指针往后跑找尾结点,另一个指针在第一个指针的前n-1个位置,那么当第一个指针到达尾结点时,第二个指针就指的是倒数第n个节点了。想清楚后代码实现就很简单。
需要注意的是链表最好新建一个节点指向头结点防止只有一个节点的特殊情况,另外此题中我使用的it指针指向的是倒数第n个节点的前一个节点,方便删除倒数第n个节点操作。
c++参考代码:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* first=new ListNode();
first->next=head;
ListNode* now=first;
while(n--)
{
now=now->next;
}
ListNode* it=first;
while(now->next!=nullptr)
{
now=now->next;
it=it->next;
}
it->next=it->next->next;
return first->next;
}
};
时间复杂度:O(N);