再记录一下删除链表的倒数第N个元素

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011123091/article/details/82113476

之前一直没关注过数据结构,最近猛刷一下。

删除倒数第N个元素,也是用两个指针,一个是先走,走了N-1次,因为刚开始指向head,这一次就不用走了。然后再然back指针走,这样front指针走到结尾的时候(指向最后的指针的时候)那么back就是指向要删除的指针了,又因为删除指针,要知道这个指针的前一个指针,所以要用一个指针,记录back的前一个指针。当然还要判断倒数第N个链表节点是否存在。下边是代码

struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
//po是先走的指针,p1是后走的指针,p2是指向p1前边的那个指针
    Node p0,p1,p2;
    int i=0;
    p0=head;
    for(i=1;i<n && p0!=NULL;i++)
    {
        p0=p0->next; 
    }
    if(i==n && p0!=NULL) 
    {
        p1=head;
        p2=p1;
    }
    else//说明超限,N大于总的指针个数
    {
        return (Node)0;
    }
    while(p0->next!=NULL)//为了使p0指向最后一个节点。如果p0!=NULL作为判断条件,那么p0最后不是//最后的节点,而是NULL,p0指向最后的节点,p1才指向要删除的节点
    {
        p2=p1;
        p1=p1->next;
        p0=p0->next;
    }
    if(p1==head)//如果删除的是头结点,就改变头节点的指向
    {
        head=head->next;
        free(p1);
    }else
    {
         p2->next=p1->next;
         free(p1);
    }
   
    return head;
}

猜你喜欢

转载自blog.csdn.net/u011123091/article/details/82113476