向有序环形单链表中插入新节点

向有序环形单链表中插入新节点

问题重述:

一个有序的环形单链表,从头节点开始升序,同时由最后一个结点指回头节点,给定一个环形链表的头节点和一个数值num,创建一个数值为num的新节点,将该节点插入到环形单链表中,要求链表始终有序

问题分析:

这道题就是简单的遍历环形单链表,然后插入新节点,只需要考虑一些特殊情况即可

链表为空:新节点成环返回

链表正常,且新节点插在中间:正常插入

链表正常,但新节点的值会影响链表的有序:将新节点插在最后一个结点和头节点的中间(这里需要注意返回的头节点需要看头节点的值和新节点谁的值小,谁的值小谁作为head返回)

解法:

链表的遍历

解题:

代码:
public static Node insertNum(Node head,int num) {
		Node newNode = new Node(num);
		if(head == null) {
			newNode.next = newNode;
			return newNode;
		}
		Node pre = head;
		Node cur = head.next;
		while(cur != head) {
			if(pre.value <= num && cur.value >= num) {
				// 当前值处于pre和cur之间,插入
				newNode.next = cur;
				pre.next = newNode;
				break;
			}
			// 更新pre和cur
			pre = pre.next;
			cur = cur.next;
		}
		if(cur == head) {
			newNode.next = cur;
			pre.next = newNode;
		}
		
		return head.value > num ? newNode : head;
		
	}

代码解析:就是对环形单链表的特殊情况进行处理,当链表为空,新节点成环返回。不为空就循环链表,当循环过程中有满足条件的位置,就将新节点插入该位置,如果循环到头节点都不满足,则将新节点插入到头节点之前。最后对新节点和头节点进行比较,返回值较小的哪一个。

总结:

当题目要求我们对链表进行插入、删除等操作的时候,我们一般都会用到当前结点的前一个结点,所以我们一般创建一个新节点来保存当前节点的前一个结点。有时候也会保存当前节点的下一个结点

posted @   foldn  阅读(206)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示