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

链表反转,就是链表原来是1->2->3->4->5,经过反转处理过后变成5->4->3->2->1

处理链表反转,有两种方式,一个是建立虚拟头结点,一个是直接操作链表反转。

1. 建立虚拟头结点

 这是执行的流程

最核心的两行就是

cur.next = ans.next;
ans.next = cur;

直接想我要让她反转,我现在设立了虚拟头结点,那我就要让新加进这个反转链表的结点的next为我反转链表中ans的next,再让ans的next设为当前结点,也就是我刚才处理的结点。

public static ListNode reverseList(ListNode head) {
    ListNode ans = new ListNode(-1);
    ListNode cur = head;
    while (cur != null) {
        ListNode next = cur.next;
        cur.next = ans.next;
        ans.next = cur;
        cur = next;
    }
    return ans.next;
}

这里我对于代码的理解是刚开始设立了ans,但是还没有将ans.next设为第一个结点1,是在第一次循环的时候做的,cur刚开始是原链表的1,循环中,

将cur.next也就是2先设立为next,让ans.next(null)给到cur.next,这里做的是让原链表头结点1的next为null,因为在反转之后,1作为链表的尾结点,next为null。

然后让cur(1)给到ans.next,就是让ans和1建立起了关联。

然后让next也就是原链表的头结点1的下一个结点,给到cur,在处理下一个结点。这样就实现了链表反转。

2. 直接在链表操作

这种也是要会的

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值