问题:
Reverse a singly linked list.
Hint:
A linked list can be reversed either iteratively or recursively. Could you implement both?
解决:
① 采用头插法,额外创建一个节点,然后将链表一次插入到头节点后面,就完成了反转。耗时0ms.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution{
public ListNode reverseList(ListNode head){
if(head == null || head.next == null) return head;
ListNode header = new ListNode(-1);
ListNode cur = head;
while(cur != null){
ListNode next = cur.next;
cur.next = header.next;
header.next = cur;
cur = next;
}
return header.next;
}
}
②迭代法,在遍历节点的时候,将当前节点的next指向它的前一个节点,因此,要预先保存前一个节点和后一个节点。
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
③ 递归法,开始时 n1 → … → nk-1 → nk → nk+1 → … → nm → Ø,我们要反转链表,就会成为 n1 → … → nk-1 → nk → nk+1 ← … ← nm,所以有nk.next.next = nk;
public ListNode reverseList(ListNode head) { if (head == null || head.next == null) return head; ListNode p = reverseList(head.next); head.next.next = head; head.next = null; return p; }