在链表反转中,主要有两种方法来进行链表反转:
- 带虚拟头结点辅助反转
- 直接在链表上操作反转
使用这两种方式的区别在于对头结点的处理
我们下面对两种方法进行介绍:
带虚拟头结点辅助反转
使用一个dummyHead虚拟头结点,这样可以使得头结点的处理方式和其他结点一样,在最后返回时返回dummyHead.next即可
我们首先建立一个dummyHead虚拟节点,并使得cur指针指向链表的头结点,post指针指向为cur的next,然后我们只需要每次从原始链表中拆下一个链表接到dummyHead的next即可
思路如下:
如上图进行操作,我们可以得到代码如下:
public ListNode reverseList(ListNode head){
if(head == null)
return null;
ListNode dummyHead = new ListNode(-1);
ListNode current = head;
while(current != null){
ListNode post = current.next;
current.next = dummyHead.next;
dummyHead.next = current;
current = post;
}
return dummyHead.next;
}
直接在链表上操作反转
直接在链表上进行操作相对于上面的方法而言增加了一个pre指针来保存cur的前驱节点(同时也是已反转链表的头结点),pre初始化为null
首先使用post指针记录此时cur的后继节点,然后将cur的next指向pre即可,然后cur指向post,pre指向cur。
思路如下:
根据上图可以得出代码如下:
public static ListNode reverseListSimple(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode post = cur.next;
cur.next = pre;
pre = cur;
cur = post;
}
return pre;
}