链表反转算法
本文分析一下链表反转的非递归算法,假设我们要把一个链表
L
L
L进行反转,考虑算法进行过程中的一个中间状态:
L
L
L被分成两个部分
L
1
L1
L1和
L
2
L2
L2,其中
L
1
L1
L1部分已经被反转,而
L
2
L2
L2部分还是原始顺序,显然在原始链表中
L
2
L2
L2的第一个节点是
L
1
L1
L1的第一个节点的后继节点,如下图所示:
接下来需要进行的操作是让
p
r
e
pre
pre成为
c
u
r
cur
cur的下一个节点,这样链表被反转的部分就增加一个节点,可按如下步骤操作:
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
按照上述步骤操作之后,L1$部分将增加一个节点,每一步操作之后维持一个定式: p r e pre pre是 L 1 L1 L1的第一个节点, c u r cur cur是 L 2 L2 L2的第一个节点。