《剑指offer》之“翻转单链表”递归、迭代、双指针解题

简介: 《剑指offer》之“翻转单链表”递归、迭代、双指针解题
题目:《剑指offer》第二十四题

https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/

解法:递归算法、迭代算法、使用双指针

开始操作~

首先加一个链表类:

static class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

解法一:迭代算法

(1)思想

使链表自身进行变化,使每个节点的next指针不断指向前一个节点,前提是当前的节点不为空。

(2)过程:
在这里插入图片描述
(3)代码:

/**
 * 迭代算法
 *
 * @param head
 * @return
 */
public static ListNode reverseList1(ListNode head) {
    //初始化声明 pre=null cur=head
    ListNode pre = null, cur = head;
    while (cur != null) {
        //获取当前链表的next
        ListNode next = cur.next;
        //将pre的值给cur的next节点
        cur.next = pre;
        //将cur赋值类pre
        pre = cur;
        //使cur等于
        cur = next;
    }
    return pre;
}

解法二:递归算法

(1)思想

首先划定一个递归的界限,就是递归停止的条件,然后不断递归调用,使自己的next节点的next节点指向当前节点

(2)过程:
在这里插入图片描述
(3)代码:

/**
 * 递归算法
 *
 * @param head
 * @return
 */
public static ListNode reverseList2(ListNode head) {
    //验证是否满足可递归条件
    if (head == null || head.next == null) {
        return head;
    }
    //进行递归
    ListNode newHead = reverseList2(head.next);
    //当前节点的next的next节点等于当前节点
    head.next.next = head;
    //当前节点的下一个节点为null
    head.next = null;
    //返回递归后的新链表
    return newHead;
}

解法三:双指针

(1)思想

每次都让 head下一个结点的 next指向 cur,实现一次局部反转,局部反转完成之后,cur 和 head的 next节点同时 往前移动一个位置,不断循环,直至 cur到达链表的最后一个结点

(2)过程:
在这里插入图片描述
(3)代码:

/**
 * 双指针方法
 *
 * @param head
 * @return
 */
public static ListNode reverseList3(ListNode head) {
    //声明头结点和当前节点
    ListNode pre = null;
    ListNode cur = head;
    while(head!=null){
        //进行局部翻转
        head = head.next;
        cur.next = pre;
        pre = cur;
        cur = head;
    }
    return pre;
}
相关文章
|
7月前
|
算法 C语言
C数据结构-翻转指针法、头插法实现单链表反转
本文介绍以C语言实现无头单链表反转的算法:翻转指针法与头插法。
62 4
|
算法
牛客网《剑指offer》专栏刷题练习之双指针算法的使用
牛客网《剑指offer》专栏刷题练习之双指针算法的使用
108 0
|
算法
【初阶数据结构】——剑指 Offer : 复杂链表(带随机指针)的复制
【初阶数据结构】——剑指 Offer : 复杂链表(带随机指针)的复制
111 0
|
C语言 C++
「2」指针进阶,最详细指针和数组难题解题思路
本篇文章,为了提高效率,也为了大家学起来更加方便,我是使用C++的处理方法,如果大家,还没有学习C++,也为大家提供C语言的版本<指针与数组>。 其实我发现指针与数组的难题主要是,二维数组和指针的问题,如果大家理解起来有些困难,主要是大家没有弄懂二维数组的实质,建议大家可以看一下, 大佬总结的二维数组超强解析,看完之后觉对这些题了如指掌!!
|
存储 Java
两个链表的第一个公共节点(剑指offer 52)Java双指针
两个链表的第一个公共节点(剑指offer 52)Java双指针
两个链表的第一个公共节点(剑指offer 52)Java双指针
调整数组顺序使奇数位于偶数前面(剑指offer 21)Java双指针
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
链表中倒数第k个节点(剑指offer 22)Java顺序查找+双指针
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
(C/C++)语法入门解题报告:结构体、类、指针、引用
(C/C++)语法入门解题报告:结构体、类、指针、引用
(C/C++)语法入门解题报告:结构体、类、指针、引用
|
算法 Java
[java刷算法]牛客—剑指offer插入排序、双指针解题
✨今日三剑 JZ20 表示数值的字符串 JZ21 调整数组顺序使奇数位于偶数前面(一) JZ22 链表中倒数最后k个结点
[java刷算法]牛客—剑指offer插入排序、双指针解题