大家好,我是「阑梦清川」
今天我们来看的是 2026 考研 408 真题中,数据结构部分的第二题。
第一题非常简单,是一个头尾相连的单循环链表。我们直接来看第二题,这一题考察的是双向链表。
双向链表和单链表的区别在于:
- 单链表:它是「单向的」。如果当前节点是 P1,后继节点是 P2,那么 P1 的 next 指针指向 P2,这就形成了一个单向的结构。
- 双向链表:「P1 的后继指针指向 P2,同时 P2 的前驱指针也指向 P1」。
所以,P2 是 P1 的后继节点,P1 是 P2 的前驱节点。这相当于它们之间是一个"你指着我,我也指着你"的关系,这就是我所理解的双向链表。
接下来,我们来看具体的题目是如何考察这个双向链表的。
首先,双向链表的结构是 P2 和 P1:P2 指向的是前驱节点,P1 指向的是后继节点。
头节点是 Head。刚开始的时候,Head 指向的是 Current(即当前节点)。你可以理解为 CU 就是 Current 这个英文单词的缩写,表示当前的节点。
题目要求的是:「先将每个节点的 P2 指向"P1 指向节点的直接后继"」。这个断句非常重要!中国文化博大精深,我第一次做这个题目的时候,就没有读懂。实际上它的意思是:
- 「P1 指向节点的直接后继」:这一整句话是一个宾语。
这个断句一定要断明白,否则这个题很难做对。
使用代码来表示,实际上这个题目说的就是想要实现:「将当前节点的 P2 指针(也就是 curr->p2),赋值给当前节点的 P1 指针的 P1 指针(也就是 curr->p1->p1)」。
具体的写法如下:
当前节点 cu 的 p2 → 要指向 → cu->p1(后继节点)的 p1
这个时候我们需要考虑「两种情况」:
「当前节点是尾节点」:在这种情况下,它没有后继节点了,所以当前节点的 p2 指针应当等于空。
「当前节点不是尾节点」:如果它还存在后继节点,我们就可以进行正常的赋值操作了。
同时,我们当前的这个节点一定是「不断向链表的后面移动的」,以防止死循环,直到移动到尾节点为止
while(cu!=NULL) {if(cu->p1!=NULL) {cu->p2 = cu->p1->p1; // 右边有节点 } else {cu->p2=NULL; // 右边没节点 }cu = cu->p1; // 换下一个节点}
「核心逻辑」:
- 判断当前节点是否有后继(cu->p1!=NULL)
- 如果有后继,则 cu->p2 = cu->p1->p1(「后继的后继」)
以上就是关于这个双向链表题目的一个介绍。
它出现在 2026 年 408 考研真题的第二个题目。如果你之前只接触过单向链表,对双向链表不是很熟悉的话,可能还是需要加强练习一下。
我是「阑梦清川」,希望得到您的关注