算法学习第三天

今日小闲话:在开始今日算法练习之前,简单把昨日所学的知识在力扣上独立敲了一下代码,需要注意的问题是变量初始化和小细节问题


反转链表题型练习(二)

练习题源:

92. 反转链表 II - 力扣(LeetCode)


反转链表巩固复习

题目:

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

 代码(包含解题思路)

解法一:反转+拼接

class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
       ListNode dummy=new ListNode(0);
       dummy.next=head;
       //增加一个虚拟空节点dummy指向NULL

/*目标:移动指针,找到left和right的位置
       找到L1和R1的位置                 */

       ListNode preleftNode=dummy;
       for(int i=0;i<left-1;i++){
           preleftNode=preleftNode.next;
       }
       ListNode leftNode=preleftNode.next;
       //先找到left前面的那个元素

         ListNode rightNode=dummy;
       for(int i=0;i<right;i++){
           rightNode=rightNode.next;
       }
        ListNode r1=rightNode.next;
        rightNode.next=null;
        //调用反转函数
        reverseLinkedList(leftNode);
        //拼接
        preleftNode.next=rightNode;
        leftNode.next=r1;
        //dummy相当于head
        return dummy.next;


    }
    //再写一个反转函数
    private void reverseLinkedList(ListNode head){
        ListNode prev=null;
        ListNode curr=head;
        ListNode next;
        while(curr!=null){
            next=curr.next;
            curr.next=prev;
            prev=curr;
            curr=next;
        }
    }
}

 解法二:穿针引线

class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
       ListNode dummy=new ListNode(0);
       dummy.next=head;
       //增加一个虚拟空节点dummy指向NULL
             
       ListNode preleftNode=dummy;
       for(int i=0;i<left-1;i++){
           preleftNode=preleftNode.next;
       }
       ListNode leftNode=preleftNode.next;
       //先找到left前面的那个元素

        
       //上述与解法一相同,目的找到L1 L 
       ListNode preleft=leftNode;
        //left后面的节点
        for(int i=left+1;i<=right;i++){
            ListNode curr=leftNode.next;
            ListNode currNext=curr.next;

            preleftNode.next=curr;
            curr.next=preleft;
            leftNode.next=currNext;

            preleft=curr;

        }
        return dummy.next;

    }
   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值