159

问答题 159 /393

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

参考答案

参考回答:

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;
}