有序环形链表插入节点

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

题目:给定一个整数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的节点

在这里插入图片描述
测试及源代码下载:源代码

猜你喜欢

转载自blog.csdn.net/shanghx_123/article/details/86541928
今日推荐