数据结构(五)——双向链表之插入顺序

数据结构 专栏收录该内容
13 篇文章 0 订阅

双向链表这里不做赘述,其特性已经普及遍了。可以参考之前博客的单向链表进行回顾学习。
在这里记录一个问题点,就是双向链表的有序插入时,赋值顺序是什么?

首先什么是有序插入,插入分为头部插入和尾部插入和按顺序插入,由于前两种比较简单,所以不会出现什么问题。

这里所记录的有序插入(或者有序添加),是最特殊的一种情况。

在这里插入图片描述
比如要插入2节点到1和3之间,因此需要对4个指针进行赋值,这里面的赋值顺序是什么,这是我们需要讨论的。

首先贴出代码在进行分析,代码解析可以看注释

//按节点排序添加
	public void addByOrder(Node node) {
		//因为是双链表,因此temp可以在插入的位置, (区别于单链表)
		Node temp = head;
		boolean flag = false;//标识插入节点位置是否存在,默认false
		
		while(true) {
			if(temp.next == null) {//已经在链表最后
				break;
			}
			if(temp.next.id > node.id) {//位置找到,就在temp后面插入
				break;
			}else if(temp.next.id == node.id){//位置已被占用,不能添加
				flag = true;//编号存在
				break;
			}
			temp = temp.next;
		}
		
		if(flag){
			System.out.printf("准备插入的英雄编号%d已被占用,不能加入\n",node.id);
		} else {
			//插入到链表,temp的后面
			//这里的顺序很有讲究,看一下
			node.pre = temp;
			node.next = temp.next;
			temp.next = node;
			temp.next.pre = node; 
		}
	}

要讨论的重点是代码的这一部分、
在这里插入图片描述
当这部分的顺序发生改变时,代码会报错或者发生运行不完的情形

也就是说,我们需要按照下面这种顺序进行赋值
在这里插入图片描述
这是因为:::(划重点!!!
我们所做的1、2步,是把要添加的node节点2变完整,是它既有next指针,又有pre指针。这样再将其他位置的指针指向node2,也会是一个完整的。而不能先指向node2,再将node2进行改变。

因此上图的顺序可以进行小调整,那就是将1、2顺序互换,但是,3、4位置不能互换

在这里插入图片描述

至于是为什么,大家可以先行思考一步,我将答案公布在评论区供大家交流学习。需要整套双链表的朋友可以留言。

新手学习,偶有不足之处希望大家指出
如果这篇文章对你有帮助的话,欢迎大家留下你的赞和评论。

  • 0
    点赞
  • 5
    评论
  • 8
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页

打赏作者

_Tunan

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值