IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 剑指 Offer 10(链表篇2).反转链表 -> 正文阅读

[数据结构与算法]剑指 Offer 10(链表篇2).反转链表

剑指 Offer 10(链表篇2).反转链表

问题描述:

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

解题思路:

了解链表本身的性质,学会利用递归和栈的思想,具体详情见代码注释。

示例:

输入: 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) {
        //引用ListNode类创建一个新的结点node,里面存储元素为空
        ListNode node = null;
        //当链表中存储的元素不为空时
        while(head != null){
            //创建一个现在的结点为头结点的下一个结点
            ListNode cur = head.next;
            //让头结点的下一个结点传递到node结点
            head.next = node;
            //使node结点为头结点,开始对链表里的元素进行反转
            node = head;
            head = cur;
        }
        //更新node结点
        return node;
    }
}

利用递归的方法实现链表反转

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { 
 *        val = x; 
 *     }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        //如果头结点和头结点的下一个结点为空,不用考虑反转,直接返回头结点即可
        if(head == null || head.next == null){
            return head;
        }
        //递归调用head.next相当于遍历了所有结点
        ListNode node = reverseList(head.next);
        //设定原现结点cur为head.next
        ListNode cur = head.next;
        //由于反转需要将现结点cur的下一个结点指向head头结点
        cur.next = head;
        //根据题目要求头结点指向空
        head.next = null;
        return node;
    }    
}

利用栈实现链表反转

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { 
 *        val = x; 
 *     }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        //如果头结点为空,不用考虑反转,直接返回头结点即可
        if(head == null){
            return head;
        }
        //建立一个栈利用栈的思想将元素反转
        Stack<ListNode> stack = new Stack<>();
        //当头结点不为空时
        while(head != null){ 
            //从头结点开始依次放入链表元素
            stack.push(head);
            head = head.next;
           
        }
        //由于链表输出需要头结点,原有的头结点已经不能使用,将第一个弹出栈的元素即为原头结点建立为新个头节点
        ListNode newHead = stack.pop();
        ListNode newNode = newHead;
        while(!stack.isEmpty()){
            ListNode cur = stack.pop();
            //头结点的下一个结点为为栈中弹出的第二个元素
            newNode.next = cur;
            //改变头结点的位置
            newNode = cur;
        }
        //根据市里要求,最后结果输出为null
        newNode.next = null;
        return newHead;
    }    
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:27:44  更:2021-08-25 12:29:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:52:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码