手写代码:循环链表插入元素?

发布于 2020-01-27 20:20:01
关注者
0
被浏览
516
1 个回答
  • 面试哥
    面试哥 2020-01-27
    为面试而生,有面试问题,就找面试哥。

    参考回答:

    typedef struct _tag_CircleListNode
    {
    struct _tag_CircleListNode * next;
    }CircleListNode;
    typedef struct _tag_CircleList
    {
    CircleListNode header;
    CircleListNode* slider;
    int length;
    }TCircleList;
    

     

    //插入元素

    int CircleList_insert(CircleList* list, CireListNode* node, int pos)
    {
    int ret = 0, i=0;
    TCircleList* sList = (TCircleList*)list;
    if (list == NULL || node== NULL || pos<0)
    {
    return -1;
    }
    CircleListNode* current = (CircleListNode*)sList;
    for(i=0; (i<pos) && (current->next != NULL); i++)
    {
    current = current->next;
    }
    

    //current->next 0号节点的地址

    node->next = current->next; //1
    current->next = node; //2
    

    //若第一次插入节点

    if( sList->length == 0 )
    {
    sList->slider = node;
    }
    sList->length++;
    

    //若头插法 current仍然指向头部

    //(原因是:跳0步,没有跳走) 中间第一种情况

    if( current == (CircleListNode*)sList )
    {
    //获取最后一个元素
    CircleListNode* last = CircleList_Get(sList, sList->length - 1);
    last->next = current->next; //3
    }
    return ret;
    }
    CircleListNode* CircleList_Get(CircleList* list, int pos) // O(n)
    {
    TCircleList* sList = (TCircleList*)list;
    CircleListNode* ret = NULL;
    int i = 0;
    if (list==NULL || pos<0)
    {
    return NULL;
    }
    {
    CircleListNode* current = (CircleListNode*)sList;
    for(i=0; i<pos; i++)
    {
    current = current->next;
    }
    ret = current->next;
    }
    return ret;
    }
    
    
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看