定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
代码实现1(自己方法通过)
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null) {
return head;
}
ListNode linkhead = head;
ListNode first = head;
ListNode second = first.next;
while (second != null) {
first.next = second.next;
second.next = linkhead;
linkhead = second;
second = first.next;
}
return linkhead;
}
}
用了三个辅助节点,其中linkhead可以放在循环里,作为临时结点(参考实现2和3)
代码实现2
class Solution {
public ListNode reverseList(ListNode head) {
ListNode cur = head, pre = null;
while (cur != null) {
ListNode tmp = cur.next; // 暂存后继节点 cur.next
cur.next = pre; // 修改 next 引用指向
pre = cur; // pre 暂存 cur
cur = tmp; // cur 访问下一节点
}
return pre;
}
}
代码实现3
class Solution {
public ListNode reverseList(ListNode head) {
return recur(head, null); // 调用递归并返回
}
private ListNode recur(ListNode cur, ListNode pre) {
if (cur == null) return pre; // 终止条件
ListNode res = recur(cur.next, cur); // 递归后继节点
cur.next = pre; // 修改节点引用指向
return res; // 返回反转链表的头节点
}
}