链表反转
1. 建立虚拟头结点辅助反转
我们可以建立虚拟结点ans,并令ans.next = head,这样可以很好的简化操作,然后我们每次从旧的链表拆下来一个结点接到ans后面就行了。如下图所示:
// 虚拟头结点法 反转链表
public static Node reverseList(Node head){
Node ans = new Node(-1);
Node cur = head;
while(cur != null){
//记录下当前结点的下一个结点,避免丢失
Node next = cur.next;
//将当前结点的下一个结点置为空,即切断原链表的那根线
cur.next = ans.next;
//将cur接入到新链表
ans.next = cur;
//操作完成cur向下走一步
cur = next;
}
return ans.next;
}
2. 直接操作链表实现反转
执行过程期间示意图:
//一般方法反转链表
public static Node reverse(Node head){
Node prev = null;
Node cur = head;
while(cur != null){
//将当前结点的下一个结点保存下来
Node next = cur.next;
//链表反转,设置当前链表的下一个结点为前结点
cur.next = prev;
//前结点等于现在结点 即前结点向后走一步
prev = cur;
//现在结点等于下一结点,即现在结点也向后走一步
cur = next;
}
return prev;
}