算法通关村第二关---链表反转

算法通关村第二关—链表反转

源码地址:GitHub-算法通关村

题目地址:LeetCode

image-20230722091010803

1.解题思路:

  1. 创建虚拟头结点:首先,创建一个名为dummyHead的虚拟头结点,它将充当反转后链表的新头结点。虚拟头结点的值设置为-1,但它不包含任何实际数据。
  2. 遍历原链表:然后,代码使用cur指针来遍历原始链表head
  3. 反转操作:在每次遍历中,将cur指向的节点从原链表中取下,并将其插入到虚拟头结点之后,成为反转后链表的新头结点。
  4. 更新指针:进行插入操作时,先将cur.next指针暂存为next,然后将cur.next指向虚拟头结点的下一个节点,再将虚拟头结点的next指针指向cur,最后将cur指向暂存的next,继续遍历原链表。
  5. 完成反转:当遍历完原链表后,虚拟头结点的next指针指向的节点就是反转后链表的新头结点。
  6. 返回结果:最后,返回反转后链表的头结点,即dummyHead.next

image-20230722094932065

/**
     * 方法1:带虚拟头结点
     *
     * @param head
     * @return
     */
    public ListNode reverseList(ListNode head) {
        ListNode dummyHead = new ListNode(-1);
        ListNode cur = head;

        while (cur != null) {
            ListNode next = cur.next;
            cur.next = dummyHead.next;
            dummyHead.next = cur;
            cur = next;
        }

        return dummyHead.next;
    }

2.解题思路:

  1. 初始化指针:首先,创建两个指针precur,分别用于记录前一个节点和当前节点。开始时,prenullcur指向原链表的头结点head
  2. 遍历原链表:通过循环遍历原链表,从头结点一直遍历到末尾节点。在每次循环中,执行反转操作。
  3. 反转操作:在每次循环中,首先将当前节点cur的下一个节点暂存为next,然后将cur.next指向pre,将当前节点指向的下一个节点指向前一个节点,实现反转操作。
  4. 更新指针:完成反转操作后,需要将指针向前移动。将pre指向当前节点cur,将cur指向暂存的下一个节点next,继续遍历原链表。
  5. 完成反转:当遍历完原链表后,pre指针所指的节点就是反转后链表的头结点。
  6. 返回结果:最后,返回反转后链表的头结点,即pre

image-20230722095006376

/**
     * 方法2:不带虚拟头结点
     *
     * @param head
     * @return
     */
    public ListNode reverseList2(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;

        while (cur != null) {
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }

        return pre;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值