反转链表(递归与双指针)

反转链表(递归与双指针)

题目描述

反转一个单链表。

示例

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

分析

这道题可以用递归,从最后一个结点,往链表头的方向逐步改变指向,非常简单

先看代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
   
    public ListNode reverseList(ListNode head) {
   

        /*
        * 递归
        * 理解cur这个点,cur是作为head的引用,cur始终指向末尾结点
        * */
            if(head==null) return head ; //出口
            
            ListNode cur = null;

            //到最后一个节点 - 出口
            if (head.next==null)
                return head ;
            //入口
            cur = reverseList(head.next) ;
            //自底向上
            head.next.next = head ;
            head.next = null  ;
            return cur ;
        }
}

核心操作

            head.next.next = head ;
            head.next = null  ;
            if(head==null) return head ; //出口

双指针

线性结构的算法,一定要去想到双指针这个策略
递归是自底向上的,很多人不理解,下面我们看看我们更适应的顺序方式,基于双指针

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
   
    public ListNode reverseList(ListNode head) {
   


         /*
        * 双指针迭代
        * */
            ListNode pre = null;
            ListNode cur = head;

            while (cur!=null){
   
                ListNode nextTemp = cur.next ;
                cur.next = pre ;
                pre = cur ;
                cur = nextTemp ;
            }
            return pre ;
        <
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值