206.反转列表 + 92.反转列表Ⅱ

文章详细介绍了如何使用迭代方法来反转链表,包括完整反转和反转链表的一部分。代码实现中,首先保存当前节点的前后节点,然后更新节点的next指针,以达到反转的效果。这种方法避免了递归,节省了空间。时间复杂度为O(n),空间复杂度为O(1)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

206.反转列表

反转列表:迭代方法,比递归好,节省空间

必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。

public ListNode reverseList(ListNode head){
        ListNode previous = null;
        ListNode curr = head;
        while(curr != null){
            ListNode next = curr.next;
            curr.next = previous;
            previous = curr;
            curr = next;
        }        
        return previous;
    }
  • 时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表一次。

  • 空间复杂度:O(1)

92反转列表Ⅱ

①找到第一个left所在结点的前一个结点pre并断开——让pre.next = null

②找到第二个rght所在结点的后一个结点next并断开——让now.next = null

③反转链表,并返回反转后链表的头结点newHead

④重新接上反转的链表

class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        if(left == right){
            return head;
        }
        //结点now是当前所指向的结点;pre要赋初值,不然left=1时候pre无值;next为right后面第一个结点
        ListNode now = head,pre = now,next = null;
        int flag = 1;

        //找到left前一个截断,设定为pre
        while(flag != left){
            pre = now;
            now = now.next;
            flag++;
        }

        //找到right后一个截断,为next
        while(flag != right){
            now = now.next;      
            flag++;
        }
       //当前now是right位置结点
        next = now.next;        //next的后一个
        now.next = null;
        ListNode newHead = null;

        //如果从第一个开始反转就走if语句第一个
        if(left != 1){
            newHead = reverseLink(pre.next);
            pre.next = newHead;
            while(pre.next != null){
                pre = pre.next;
            }
            pre.next = next;
            return head;
        }else{
            newHead = reverseLink(pre);
            head = newHead;
            while(newHead.next != null){
                newHead = newHead.next;
            }
            newHead.next = next;
            return head;
        }
    }

    //206.反转链表
    public ListNode reverseLink(ListNode head){
        ListNode pre = null;
        ListNode now = head;
        ListNode newHead = null;
        while(now != null){
            newHead = now;
            ListNode next = now.next;
            now.next = pre;
            pre = now;
            now = next;
        }
        return newHead;
    }
}
  • 时间复杂度:O(N),其中 N是链表总节点数。

  • 空间复杂度:O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值