题目描述
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
方法思路
Approach1: iteratively
class Solution {
public ListNode reverseList(ListNode head) {
//Runtime: 0 ms, faster than 100.00% of Java
//Memory Usage: 37.9 MB, less than 14.74% of Java
/*遍历反转法是从前往后反转各个结点的指针域的指向。
基本思路是:将当前节点cur的下一个节点 cur.getNext()缓存到temp后,然后更改当前节点指针指向上一结点pre。
也就是说在反转当前结点指针指向前,先把当前结点的指针域用tmp临时保存,以便下一次使用,其过程可表示如下:
pre:上一结点
cur: 当前结点
tmp: 临时结点,用于保存当前结点的指针域(即下一结点)
data域+ next域:组成数据ai的存储映射,称为结点;
*/
// 遍历法(iteratively)
ListNode prev = null;
ListNode curr = head;
while(curr != null){
ListNode nextTemp = curr.next; //把当前结点的指针域用tmp临时保存,以便下一次使用
curr.next = prev; //更改当前结点指针域指向上一结点prev 最为关键的一步
prev = curr; //把当前结点域传给上一结点域,进行覆盖
curr = nextTemp; //将下一结点赋值给当前结点
}
return prev;
}
}
Approach2: recursively
class 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;
}
}