class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public ListNode ReverseList(ListNode head) {
//用三个节点作为辅助 pre cur aft
//pre节点保存上一个节点 cur 节点保存当前反转的节点 aft保存当前节点 反转后断开的下一节点
if (head == null)
return null; //头结点为null直接返回
ListNode pre = head;
ListNode cur = null;
if (pre.next != null) { //如果下一节点不为空,cur保存下一节点
cur = pre.next;
if (cur.next == null) { //如果cur节点的下一节点为空。说明当前就有两个节点 ,应该断开头结点的下一节点,
//并将cur节点的下一节点,指向头结点 。链表反转完成
pre.next = null;
cur.next = pre;
return cur;
}
} else {
return pre;
}
pre.next = null; //将头结点的下一个节点断开,防止前两个节点变成环
ListNode aft = cur.next; //保存aft节点
while (cur != null) {
cur.next = pre; //cur节点的下一节点指向pre 反转
pre = cur; //pre后移
cur = aft; //cur后移
if (aft.next != null)
aft = aft.next; //如果aft后面还有节点 ,aft后移
else {
cur.next = pre; //如果没有,立即反转后移一位的cur节点
break;
}
}
return cur;
}