难度:1
删除链表里倒数第n个节点
据说标准算法是两个指针,同时向右扫,相差n-1,当后面的没有后继时就找到了倒数第n个节点
我的算法很简单,从左到右扫一遍,记录个数num,再从头到尾移动num-n次,就找到该节点
题目说尽量只扫一次,我扫了两次,
但是如果我刚才说的标准算法真的是标准算法的话,
会分析复杂度的同学都知道两者的时间复杂度一样的,我的方法相比标准算法更简单明了(一切的前提是那个标准算法真的是标准算法的前提下)
我做了比较,
我的方法是36MS,所谓的标准算法是40MS,时间差不多,如果有更好的方法,请联系我!
class Solution
{
public:
ListNode *removeNthFromEnd(ListNode *head, int n)
{
ListNode *p=head;
int num=0;
while(p)
{
num++;
p=p->next;
}
if(num == n)
{
ListNode *ans=head->next;
free(head);
return ans;
}
num-=n;
p=head;
for(int i=0;i<num-1;i++)
{
p=p->next;
}
ListNode *tmp=p->next;
p->next=p->next->next;
free(tmp);
return head;
}
};