反转单链表原地法与头插法
单链表遍历打印
我们先复习一下单链表遍历打印
public void printLink(){
Node curNode = head;
while(curNode !=null){
System.out.print(curNode.data+" ");
curNode = curNode.next;
}
System.out.println();
}
单链表打印是用一个curNode
的单指针
来判断单链表是不是空,不是空,直接打印,后移,再判断是不是空。
直到是空为止,结束打印。
双指针反转单链表
这里的"双指针反转单链表"是两个指针prev和curr。prev
指向前一个结点
,curr
指向当前节点
。
public ListNode reverseList(ListNode head) {
//当前节点的前一个节点
ListNode prev = null;
//定义一个辅助指针帮我们遍历原来的链表
ListNode curr = head;
while(curr!=null){
//备份原来的节点
ListNode nextTemp = curr.next;
curr.next = prev;//指针反转
prev = curr;//前结点后移
curr = nextTemp;//当前结点后移
}
return prev;
}
关键是理解这两步
curr.next = prev;
prev = curr;
这两步,curr.next=prev
其实可以对照实例想一下,2指向3的指针,指向了1。
就是说,指针原来从左右,就变为了右左。
指针反转就完了?不是的,我们只是把当前链表的指针向反转了,新的链表的指针还没有移动。
所以,我们要prev = curr
,让prev移动。
其实,这里的prev是反转后的链表的头节点。注意了,这里的头结节可不是什么辅助节点,是真真实实有数据的头节点。
一定要根那种辅助头区分开来。
理解了这两步,我们就不断的判断curr指针是不是空,不断的反转就可以了。最后curr==null
时,
我们就返回prev指针。