有序环形链表插入节点
题目:给定一个整数num,如何在节点有序的环形链表中插入一个节点值为num的节点,并保证这个环形链表依然有序。(假如链表是升序)
解决思路:
1.如果链表为空,则开辟一个节点,让后让他自己指向自己,然后返回该节点。
2.如果链表不为空,分为三种情况:
a.如果插入的节点的值是在环形链表最大值和最小的闭区间范围之内,即在链表[min,max]里面,那么先找到要插入的位置,然后插入。
b.如果插入的节点的值大于链表最后一个值,那么插入的位置就直接是最后一个节点的后面,然后让他指向头结点,最后返回头结点。
c.如果插入的节点小于链表的第一个节点,也就是小于最小的一个节点,那么插入的位置还是链表的最后一个节点的后面,然后让他指向头结点,最后返回新插入的节点。
有了方法,代码就比较好写了。
typedef struct node
{
DataType data;
struct node *p_next;
}Node ,*PNode;
PNode InsertInCircle(PNode head,DataType data)//插入一个节点在有序链表中,并且插入之后链表有序
{
//1.如果环形链表是空,则将该节点插入,返回该节点
if (head == NULL)
{
PNode pCur = NULL;
pCur = (PNode)malloc(sizeof(Node));
pCur->data = data;
pCur->p_next = pCur;
return pCur;
}
else
{
//2.先找到只要插入的位置
pCur = head->p_next;
PNode pPre = head;
while (pCur != head)
{
//a.插入位置在链表内
if (pPre->data <= data && pCur->data >= data)
{
PNode pNode = (PNode)malloc(sizeof(Node));
pNode->data = data;
pPre->p_next = pNode;
pNode->p_next = pCur;
return head;
}
pPre=pPre->p_next;
pCur = pCur->p_next;
}
//.出循环,说明此时data是链表中最大或者是最小的节点
//此时pCur==head
PNode pNode = (PNode)malloc(sizeof(Node));
pNode->data = data;
pPre->p_next = pNode;
//b.比头结点小
pNode->p_next = pCur;
if (data < head->data)
return pNode;
else
//比头结点大
return head;
}
}
结果:
测试的链表有5个节点,分别是1->2->3->4->5->1(最后的1是多打印了一次原链表只有一个值为1的节点)…
1.当链表为空
2.插入值为1的节点
3.插入值为2的节点
4.插入值为5的节点
5.插入值为6的节点
测试及源代码下载:源代码