网上关于这个主题的讲解和代码很多,本文不做过于详尽的描述。本文主要从思考的角度来看待这个问题,如何实现在双链表中插入特点的节点。
如图所示,这是一个常见的双向链表结构。每一个节点存在三个域,分别是数据值部分、前向域和后向域。在没有准备插入节点之前,A 和B 节点的关系如图中1,2线条所示,A节点的后向域指向B节点,B节点的前向域指向A节点。那么,如果需要在A节点之后插入一个节点C,该如何插入呢?实际上,从前面的描述中我们可以知道,要想在A节点和B节点间插入C节点,实际上就是要改变线条1,2的指向关系,令他们重新指向新节点,实现达到目的的效果。
因为是在A节点之后插入新节点,所以,A节点的信息是已知的且目前不会变化的,那么我们可以先处理"未知的"B节点和C节点的关系。实现B节点和C节点的连接关系,就是实现将C节点的后向域指向B节点,将B节点的前向域指向C节点,如图中step1和step2所示。那么step1和step2的顺序可以交换吗?当然是可以的。这就是我们前面所说的先处理B节点和C节点的关系,因为无论step1和step2如何变化,我们都能准确无误通过A的后向域找到B节点。好,B节点和C节点的关系处理完毕。
接下来我们需要做的是,处理A节点和C节点的关系,如下图中所示,那么step3和step4的顺序可以交换吗 ?当然也是可以的。因为此时A和C 是相对独立的2个节点,step3和step4顺序不影响两者之间的连接关系。
代码总结如下:
typedef struct Node{
int data;
struct Node* next;
struct Node* prev;
}node;
void InsertNode(node* A, int data)
{
if(NULL == A)
return;
node* C = (node*)malloc(sizeof(node));
C->data = data;
C->next = NULL;
C->prev = NULL;
C->next = A->next;
A->next->next = C;
C->prev = A;
A->next = C;
}
当然,上述代码写的比较简单,实际情况还需要考虑头和尾的边界情况。