目录
题目描述
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?
实现
实现部分参考了这篇文章,里面的图片解释很清楚。
1.迭代法
思路:重新创建一个链表用来存储反转后的数,创建链表的方法有头插法和尾插法。单链表的遍历方式是从头结点到尾结点,那么我们可以从头取出数字,用头插法建立链表,不断将节点插入新链表头部,直到遍历到尾结点,于是得到一个反转后的链表。这个算法的时间复杂度是O(n),空间复杂度是O(1)。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if( head == null)
return head;
ListNode newH = head;
ListNode pointer = head.next;
newH.next = null;
while(pointer != null) {
ListNode temp = pointer.next;
pointer.next = newH;
newH = pointer;
pointer = temp;
}
return newH;
}
}
2.递归法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode newH = reverseList(head.next);
head.next.next = head;
head.next = null;
return newH;
}
}