题目描述
反转一个单链表
示例:输入1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
思路
(1)迭代法:用一个节点next指向当前节点的下一个节点,用pre指向前一个节点,在反转的时候要保留下一个节点的值,以便取到下一个几点,然后将当前节点的下一个节点指向pre,指完后将pre指向当前节点,然后当前节点指向next,继续进行遍历。因为要遍历所有的节点,因此时间复杂度为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 null;
ListNode pre = null;
ListNode cur = head;
//若没有遍历到最后一个节点,则继续遍历
while(cur != null){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;//遍历结束后,pre指向的是最后一个节点
}
}
(2)递归法思想是和迭代法一样的,每次记录当前节点的下一节点,然后将当前节点的next指向它的pre,因此要注意区分的是递归方法的两个形参分别是前驱节点和当前节点,而调用递归方法,传进去的实参分别是当前节点和下一个节点;递归结束的标记是下一个节点为空,则返回前驱节点。
代码–递归法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
return reverseList(null, head);
}
public ListNode reverseList(ListNode pre, ListNode cur){
//下一个节点为空时,递归结束,返回前驱节点
if(cur == null)
return pre;
ListNode temp = cur.next;
cur.next = pre;
return reverseList(cur, temp); //实际调用的是当前节点和下一节点,传入后将当前节点作为前驱节点
}
}