方法一:
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节点的指向关系更改。
这篇博客介绍了两种反转链表的方法:迭代法和递归法。迭代法通过维护当前节点和下一个节点的引用,逐步调整节点的指向实现反转。递归法则通过递归调用,每次将当前节点的下一个节点指向前一个节点,直至遍历到底,然后在回溯过程中调整节点指向。这两种方法都有效地实现了链表的反转操作。

被折叠的 条评论
为什么被折叠?



