链表的反转可以分为两种:1.带头节点 2.不带头节点
1.建立虚拟头节点辅助反转
首先设置一个虚拟节点virtual,令virtual.next = head,然后将原来链表的节点一次拆下来,接在virtual后面。
代码实现:
public static Node invertListByNode(Node node){
Node virtual = new Node();
Node cur = node;
while(cur != null){
Node next = cur.next;// 下个节点为当前节点的下一个节点
cur.next = virtual.next;//当前节点的下一个节点指向虚拟节点的下一个节点
virtual.next = cur;//虚拟节点的下一个节点指向当前节点
cur = next;
}
return virtual.next;
}
2.直接操作链表实现反转
这一种方式不适用辅助节点,直接改变链表中指针的方向即可。
在操作时,用cur指向当前链表的首节点,pre表示已经反转后的链表的首节点,next表示下一个要调整的节点。
代码实现:
public static Node invertList(Node node){
Node pre = null;
Node cur = node;
while (cur != null){
Node next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}