代码为本人改为python程序(图中的c语言的NULL即为python中的None)

 

很多公司的面试题库中都有链表倒叙道题,有的公司明确题目要求不能使用额外的节点存储空间,有的没有明确说明,但是如果面试者使用了额外的节点存储空间做中转,会得到一个比较低的分数。

如何在不使用额外存储节点的情况下使一个单链表的所有节点逆序?我们先用迭代循环的思想来分析这个问题,链表的初始状态如图(1)所示:

双链表打印顺序反了怎么调回顺序Python python链表倒序输出_链表

 初始状态,prev是NULL,head指向当前的头节点A,next指向A节点的下一个节点B。首先从A节点开始逆序,将A节点的next指针指向prev,因为prev的当前值是NULL,所以A节点就从链表中脱离出来了,

然后移动head和next指针,使它们分别指向B节点和B的下一个节点C(因为当前的next已经指向B节点了,因此修改A节点的next指针不会导致链表丢失)。

逆向节点A之后,链表的状态如图(2)所示:

双链表打印顺序反了怎么调回顺序Python python链表倒序输出_逆序_02

 从图(1)的初始状态到图(2)状态共做了四个操作,这四个操作的伪代码如下:

双链表打印顺序反了怎么调回顺序Python python链表倒序输出_迭代_03

这四行伪代码就是循环算法的迭代体了,现在用这个迭代体对图(2)的状态再进行一轮迭代,就得到了图(3)的状态:

双链表打印顺序反了怎么调回顺序Python python链表倒序输出_链表_04

图(3)经过第二次迭代后的状态

         那么循环终止条件呢?现在对图(3)的状态再迭代一次得到图(4)的状态:

双链表打印顺序反了怎么调回顺序Python python链表倒序输出_链表_05

图(4)经过第三次迭代后的状态

 此时可以看出,在图(4)的基础上再进行一次迭代就可以完成链表的逆序,因此循环迭代的终止条件就是当前的head指针是None。

 

现在来总结一下,循环的初始条件是:

prev == None;

 

循环迭代体是:

双链表打印顺序反了怎么调回顺序Python python链表倒序输出_迭代_03

循环终止条件是:

head == None

 但是当我们头为最后一个数时,head,next为空,循环就不能再进行下去了,所以在循坏结束后我们要在手动让最后一个数指向前一个数。

根据以上分析结果,逆序单链表的循环算法如下所示:

双链表打印顺序反了怎么调回顺序Python python链表倒序输出_逆序_07

 

在第14期说过链表的增减,今天用python实现以下增减和倒叙

创建列表并创建打印链表的方法:

双链表打印顺序反了怎么调回顺序Python python链表倒序输出_迭代_08

创建插入元素的方法:

双链表打印顺序反了怎么调回顺序Python python链表倒序输出_逆序_09

创建删除元素方法:

双链表打印顺序反了怎么调回顺序Python python链表倒序输出_链表_10

创建倒置元素方法:

双链表打印顺序反了怎么调回顺序Python python链表倒序输出_迭代_11

创建链表实例、通过编号操作:

双链表打印顺序反了怎么调回顺序Python python链表倒序输出_迭代_12