Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
Follow up:
A linked list can be reversed either iteratively or recursively. Could you implement both?
my solution
现在所有node读出来放到堆栈里面,然后再弹出来
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null) return head;
Stack<ListNode> stack = new Stack<ListNode>();
while(head!=null)
{
stack.push(head);
head = head.next;
}
ListNode ans = stack.pop();
head = ans;
while(!stack.isEmpty())
{
head.next = stack.pop();
head = head.next;
}
head.next = null;
return ans;
}
}
iterative soluton
记录两个链表,一个是reversingList,另一个是initialList
prev 记录reverseList的最新插入表头的第一个节点,curr记录initialList的第一个节点,只要curr不等于空,就把initialList的第一个节点取出来放到reverseList的最开始。做法是:先记录initialList的下一个节点,然后把curr插入reverseList,然后更新prev和curr
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;
}
recursive solution
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;
}