双向链表操作
我们将在双链表的实现中探讨以下操作。虽然这些操作听起来与单链表中使用的操作类似,但它们在实现上有很大的不同:
-
在第一个节点插入
-
插入最后一个节点
-
在特定节点之前插入
-
在特定节点后插入
-
删除第一个节点
-
删除最后一个节点
-
搜索并删除一个节点
-
向前显示列表
-
向后显示列表
首先插入节点
在前端或头部添加节点时,我们必须检查列表是否为空。如果列表为空,则第一个和最后一个节点都将指向新创建的节点。但是,如果列表已经有了头部,我们就必须执行以下操作:
-
创建新节点。
-
将新节点设为第一个节点或头部。
-
将前一个节点头或第一个节点指定为下一个节点,紧随新创建的第一个节点。
-
将前第一个节点的前一个链接分配给新的第一个节点。
这是代码:
Unresolved include directive in modules/ROOT/pages/ch03/ch3-08.adoc - include::example$Chapter03/3.php[]
插入到最后一个节点
由于我们现在跟踪的是最后一个节点,因此在最后插入一个新节点会更容易。首先,我们需要检查列表是否为空。如果是空的,那么新节点既是第一个节点,也是最后一个节点。但是,如果列表中已经有了最后一个节点,那么我们就必须执行以下操作:
-
创建新节点。
-
将新节点设为最后一个节点。
-
将前一个最后一个节点指定为当前最后一个节点的前一个链接。
-
将前一个最后一个节点的下一个链接分配给新最后一个节点的前一个链接。
这是代码:
Unresolved include directive in modules/ROOT/pages/ch03/ch3-08.adoc - include::example$Chapter03/3.php[]
在特定节点之前插入
在特定节点前插入节点需要我们首先找到该节点,然后根据其位置,我们需要更改新节点、目标节点和目标节点前的节点的下一个和上一个节点,如下所示:
Unresolved include directive in modules/ROOT/pages/ch03/ch3-08.adoc - include::example$Chapter03/3.php[]
在特定节点之后插入
在特定节点后插入与我们刚才讨论的方法类似。在这里,我们需要为新节点、目标节点和目标节点之后的节点更改下一个和上一个节点。下面是相关代码:
Unresolved include directive in modules/ROOT/pages/ch03/ch3-08.adoc - include::example$Chapter03/3.php[]
删除第一个节点
当我们从双链表中删除第一个节点时,只需将第二个节点设为第一个节点即可。将新的第一个节点的前一个节点设置为 NULL
,然后减少节点总数,就像下面的代码一样:
Unresolved include directive in modules/ROOT/pages/ch03/ch3-08.adoc - include::example$Chapter03/3.php[]
删除最后一个节点
删除最后一个节点要求我们设置一个次于最后一个节点的节点作为新的最后一个节点。此外,新创建的最后一个节点不应有任何下一个引用。代码示例如下:
Unresolved include directive in modules/ROOT/pages/ch03/ch3-08.adoc - include::example$Chapter03/3.php[]
搜索并删除一个节点
当我们要从列表中间删除一个节点时,必须重新调整所要查找项目的上一个节点和下一个节点。首先,我们要找到目标节点。获取目标节点的上一个节点和下一个节点。然后,将前一个节点之后的节点指定为指向目标节点之后的下一个节点,反之亦然。下面是相关代码:
Unresolved include directive in modules/ROOT/pages/ch03/ch3-08.adoc - include::example$Chapter03/3.php[]