双向链表插入节点
1、根据实例分析
2、把节点之间的关系看成 是边的拆除和重建
3、为了方便叙述,给边标了号
如图所示是我们要操作的结构体和在双向链表的图。
现在我们的目的就是在ab节点之间插入x节点。
现在我把这六条线都遍上号:
在插入之前,2,6这两条边是存在的,这两条边就是:
在插入之后,2,6这两条边不存在了,存在的边为4,1,3,5,这四条边就是:
所以要想实现在a,b节点中插入x节点,也就是实现
。
在这个图中,1和6是同一条边,都是a->next,3和2是同一条边,都是b->pre.
现在我们是通过p指针在这个双休链表中找到了b节点,也就是p==b的,并且我们有一个x节点是待插入的。
在这种情况下,我们找a节点就只能通过p节点,p->pre就代表a。
显然2这条边就是p->pre,所以我们要想找到a节点,就必须有2这条边。
而1,4两条边的操作都和a节点有关。
所以我们要想操作1,4两条边,就必须有a节点,也就是2这条边。
5这条边的插入顺序很自由,因为我们的x节点和p节点都是已知的。
所以我们的一个插入顺序为这样:
1、先拆第6条边,接上第一条边:
2、然后接上第4条边:
3、然后接上第5条边:
4、最后拆除第二条边接上第三条边:
大工告成。
说一句,这个循序不是唯一的,比如说5这条边我可以在任意时候插入。
并且如果p节点现在不是指向b,而是指向a,那么一切又都变化了,所以重在理解吧。