最先想到的思路是仅遍历一遍单链表,在遍历的过程中修改指针使得目标节点的next节点指向之前的节点。
为了简便我们可以首先考虑普遍(遍历在链表中部)的情况,我们有三个节点h(head),p,t(tmp),如下图所示。
具体的步骤已经在图中给出,此时的局面是h已然指向前驱节点,接下来只需要把p的next指向h即可。反转的操作在步骤2,步骤3、4为了套娃。
特殊的情况(遍历在第一个节点)h是没有前驱节点的,如下图所示。
我们只需要构造出h指向前驱节点这个事实即可,如步骤3。
最后一个特殊情况(遍历结束)只需要判断t是否是None即可。
详细代码如下
def reverse(self):
if self._head is None:
return
h = self._head
p = h.next
h.next = None
while True:
tmp = p.next
p.next = h
h = p
if tmp is None:
break
p = tmp
self._head = p