方法一:
public ListNode reverseList(ListNode head) {
ListNode cur = head;
ListNode next = null;
while (cur != null) {
ListNode pre = cur.next;
cur.next = next;
next = cur;
cur = pre;
}
return head;
}
当前节点cur,和下一个节点next。
因为要反转,第一次的下一个节点应该为null,即将链表首转为链表尾。
接着遍历,因为要改当前节点指向,需要额外存起来,修改完当前节点指向,cur和next指针都需要向前遍历一个节点。
方法二:
递归法:
public ListNode reverseList1(ListNode head) {
return recur(head, null);
}
ListNode recur(ListNode cur, ListNode pre) {
if (cur == null) {
return pre;
}
ListNode res = recur(cur.next, cur);
cur.next = pre;
return res;
}
通过将cur,pre持续遍历到底后,return最底层的pre,即反转后的头结点。
代码中res始终没有变,一直都是最底层的pre节点。
在遍历到最底层回溯时,把cur节点的指向关系更改。