java小白也能学会手写链表反转——第二关(青铜挑战)

1.LeetCode206题

​​​​​​​https://leetcode.cn/problems/reverse-linked-list/submissions/486178706/

1.1建立虚拟头结点辅助反转

首先可以建立一个虚拟的结点ans,并且令ans.next=head,这样可以很好的简化我们的操作,如下图,我们将链表{1->2->3->4->5}进行反转,我们首先建立虚拟结点接到ans后面,然后将其他线调整好就可以了 

如上图所示,我们完成最后一步之后,只要返回ans.next就得到了反转的链表,代码如下: 

//方法1:创建虚拟结点发
public static ListNode reverseListByDummyNotCreate(ListNode head) {
    // 创建一个虚拟头节点,初始时指向 -1
    ListNode ans = new ListNode(-1);
    // cur 指向当前节点,初始为链表的头节点
    ListNode cur = head;

    while (cur != null) {
        // next 指向当前节点的下一个节点
        ListNode next = cur.next;
        // 将当前节点的 next 指针指向 ans 的下一个节点,实现反转
        cur.next = ans.next;
        // 将 ans 的 next 指针指向当前节点,更新 ans 的指向
        ans.next = cur;
        // 将 cur 指针后移一位,继续遍历链表
        cur = next;
    }
    // 返回反转后的链表头节点
    return ans.next;
}

1.2直接操作链表实现反转

上面的方式虽然好理解应用也广 ,但是在面试的时候可能会被考官禁止,因为更考察面试者的能力。

在图中,cur本来指向旧链表的首结点,pre表示已经调整好的新链表的表头,next是下一个要调整的。注意图中箭头方向,cur和pre是两个表的表头,移动过程中cur经过一次中间状态之后,又重新变成了两个链表的表头。 ​​​​​​​

public static ListNode reverseListSimple(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        while (curr != null) {
            ListNode next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值