链表面试题(六)---删除单链表倒数第k个结点

来源:互联网 发布:mac os重装找不到硬盘 编辑:程序博客网 时间:2024/05/29 12:30

一、结构体定义

typedef int DataType;typedef struct ListNode//定义结点{    DataType data;    struct ListNode* next;}ListNode,*PListNode;typedef struct  PList//定义一个成员是指向结点的指针的结构体{    PListNode PHead;}PList,*PList;

这里写图片描述

二、函数实现
(1)删除单链表倒数第k个结点—(k >1&& k<链表总结点数)—O(N)

void DelKNode1(PList PList,int k){    PListNode front=NULL;    PListNode back=NULL;    PListNode del=NULL;    int i=0;    assert(PList);    front=PList->PHead;    back=PList->PHead;    if (PList->PHead==NULL)//如果是空链表    {        return ;    }    else     //如果不是空链表,k>1 && K<链表总节点数    {        for(i=1;i<k;i++)   //front先走到k-1步,由于不知道链表的总节点数,所以要时刻注意链表访问越界        {            front=front->next;        }        while (front->next)        {            front=front->next;            back=back->next;        }        del=back->next;        back->data=del->data;        back->next=del->next;        free(del);    }}

另一种写法:
另一种写法

(2)删除单链表倒数第k个结点(K任意–有可能出现不合理情况)

//6.1【6的加强版】删除单链表倒数第k个结点(K任意--有可能出现不合理情况)---O(N)void DelKNode2(PList PList,int k){    PListNode front=NULL;    PListNode back=NULL;    PListNode del=NULL;    int i=0;    assert(PList);    front=PList->PHead;    back=PList->PHead;    if (PList->PHead==NULL||k<=0)//如果是空链表或者k<=0    {        return ;    }    if (k==1&&PList->PHead->next==NULL)//如果结点数为1,k==1    {        free(front);        PList->PHead=NULL;        return;    }    if (k==1)//如果不是空链表,结点数>1,k==1    {        while (front->next->next)        {            front=front->next;        }        free(front->next);        front->next=NULL;        return;    }    else     //如果不是空链表,k>1    {        for(i=1;i<k;i++)   //front先走到k-1步,由于不知道链表的总节点数,所以要时刻注意链表访问越界        {            if (front->next)            {                front=front->next;            }            else//当k的值大于结点个数            {                return ;            }        }        while (front->next)        {            front=front->next;            back=back->next;        }        del=back->next;        back->data=del->data;        back->next=del->next;        free(del);    }}
阅读全文
0 0