【剑指Offer(专项突破)】024. 反转链表(Java实现) 详细解析

题目:

给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。

示例:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

leetcode题目连接:力扣

解法一:迭代

设置三个指针,分别指向左结点leftP,右结点rightP,为了防止反转时链表断开,需要保存右结点后面的一个结点,可以设置为tmpP,在遍历时,让右指针的next为左指针

Java代码实现: 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode leftP = null; //使链表最后一个结点指向null
        ListNode rightP = head;
        while(rightP != null){
            ListNode tmpP = rightP.next;
            rightP.next = leftP;
            leftP = rightP;
            rightP = tmpP;
        }
        return leftP; //leftP成为尾结点
    }
}

复杂度分析:

时间复杂度:O(N),N为链表长度

空间复杂度:O(1)

代码执行结果:

 

解法二:递归

可以把递送过程拆成两个子问题,即head和head.next的子链,head.next的子链的反转可以可以调用reverseList()方法,head的反转可以用head.next.next = head, head.next = null实现

 

Java代码实现:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        //递归终止条件
        if(head == null || head.next == null){ 
            return head;
        }
        ListNode p = reverseList(head.next); //p为head后面已经反转成功的链表,返回值都为p
        head.next.next = head;
        head.next = null;
        return p; //最后返回的都是head,因此直接返回p即可
    }
}

复杂度分析:

时间复杂度:O(N),N为链表长度,每个结点都要进行反转

空间复杂度:O(N),N为链表长度,空间复杂度主要取决于递归调用的栈空间,最多为 N 层。

代码执行结果:

 

以上为个人做题笔记,很多是自己的理解,若有错误还请各位大佬指出~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值