直接操作链表实现反转
我们观察一下反转前后的结构和指针位置:
我们再看一下执行期间的过程示意图,在图中,cur本来指向旧链表的首结点,pre表示已经调整好的新链表的表头,next是下一个要调整的。注意图中箭头方向,cur和pre是两个表的表头,移动过程中cur经过一次中间状态之后,又重新变成了两个链表的表头。
public static Node reversal(Node list){
Node head = null; //初始化最终反转的链表(L1)
Node cur = list; //初始化待反转的链表(L2)
while (cur!=null){ //从(L2)头结点开始,一次反转一个结点的位置(逐步将L2的结点转到L1)
Node temp = cur.next; //将(L2)下一个结点暂存
cur.next = head; //将(L1)的头结点拼接到(L2)头结点之后
head = cur; //将已经反转的部分,用head结点标记头结点
cur = temp; //cur标记之前暂存的头结点
}
return head;
}