一、带有虚拟头节点的链表反转
如图所示。ans是一个虚拟头节点,用来接收反转后的链表;cur指向初始链表,用于拿到各个结点,并把它插入ans.next.
第一步:拿到cur.next,令它等于next,不然当cur所在节点插入ans后的时候会丢失原链表。
第二步:将cur所在节点插入ans后,如图所示
第三步:令cur重新指向cur.next,即是cur = next;
代码如下 :
public static ListNode reverseList(ListNode head) {
ListNode ans = new ListNode(-1);
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = ans.next;
ans.next = cur;
cur = next;
}
return ans.next;
}
二、不带虚拟头节点的链表反转
取执行期间一部分来看的话。prev是新链表的头,同时也是每次将拆下来的节点插入。cur指向旧链表的,用于遍历取节点,next用于暂存cur.next
第一步:先取到cur.next,令其等于next。防止cur指向prev后取不到原链表
第二步:将cur指向prev,然后prev指向cur,即相当于插入头节点
第三步:cur=next,为下一次循环做好准备
代码如下:
public ListNode reverseList(ListNode head ) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}