链表的基本操作——反转与删除

引言

链表相关的问题几乎都是coding问题,以下是两个简单的链表问题。

一、单链表或双链表如何反转

1.1 单链表的反转操作

给定一个 Node 结构:

public static class Node {public int value;public Node next;public Node(int data) {this.value = data;}
}

这是一个单链表结构, 假设初始时,a --> b --> c --> null :

Node a = new Node(1);
Node b = new Node(2);
Node c = new Node(3);
a.next = b;
b.next = c;
c.next = null;

那么如何实现指针的反转,最终 c --> b --> a --> null ?

代码实现:

public static Node reverseLinkedList(Node head) {Node prev = null;Node next = null;while (head != null) {// 取得下一个Nodenext = head.next;// 改变当前 head 的指针,使其指向 prevhead.next = prev;// 后两步是变换角色,把当前的 head 变成 prevprev = head;// 把 next 下一次循环的 headhead = next;}// 因为最后 head 为 null 才会跳出循环,因此,需要返回 prev 元素return prev;
}

测试:

public static void main(String[] args) {Node a = new Node(1);Node b = new Node(2);Node c = new Node(3);a.next = b;b.next = c;c.next = null;Node head = a;printNodes(head);Node newHead = reverseLinkedList(head);System.out.println("\n反转后:");printNodes(newHead);
}public static void printNodes(Node head) {while (head != null) {System.out.print(head.value);head = head.next;}
}

1.2 双向链表反转

public class LinkedListTest2 {public static Node[] nodes = new Node[3];static {Node a = new Node(1);Node b = new Node(2);Node c = new Node(3);a.prev = null;a.next = b;b.prev = a;b.next = c;c.prev = b;c.next = null;nodes[0] = a;nodes[1] = b;nodes[2] = c;}public static void main(String[] args) {Node head = nodes[0];printNodes(head);Node newHead = reverseLinkedList(head);System.out.println("\n反转后:");printNodes(newHead);}public static void printNodes(Node head) {while (head != null) {System.out.println(head.prev + " <-- " + head.value + " --> " + head.next);head = head.next;}}public static class Node {public Node prev;public int value;public Node next;public Node(int value) {this.value = value;}public String toString() {return Integer.valueOf(value).toString();}}/*** prev <-- head --> next*/public static Node reverseLinkedList(Node head) {Node prev = null;Node next = null;while (head != null) {next = head.next;prev = head.prev;head.prev = next;head.next = prev;prev = head;head = next;}return prev;}
}

二、把给定值的节点都删除

LeetCode 地址:剑指 Offer 18. 删除链表的节点

    /*** 2 -> 2-> 3-> 2-> 3-> 4* 若:删除 num = 3,得到:* 2 -> 2-> 2-> 4,return head = 2* 若:删除 num = 2 得到:* 3-> 3-> 4 ,return head= 3* @param head* @param val* @return*/public static ListNode removeValue(ListNode head, int val) {// head 来到第一个不需要删除的位置while(head != null) {if (head.val != val) {break;}head = head.next;}// 1、head == null 表示所有 node 都是 num,return null// 2、head != nullListNode prev = head;ListNode curr = head;while (curr != null) {if (curr.val == val)prev.next = curr.next;elseprev = curr;curr = curr.next;}return head;}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单向队列、双端队列、栈的模型实现

引言 自己实现简单的队列、栈的逻辑结构。 队列都包含头和尾两个指针&#xff0c;简单的单向队列只能在一端&#xff08;如&#xff1a;head端&#xff09;入列&#xff0c;在另一端&#xff08;如&#xff1a;tail 端&#xff09;出列&#xff1b;双端队列可以在 head 进出&…

递归算法及其时间复杂度分析

引言 “递归” 一词是比较专业的计算机术语&#xff0c;在现实生活中&#xff0c;有一个更可爱的词——“套娃”。如果把“递归算法”叫做“套娃算法”&#xff0c;或许可以减少一些恐惧程度。 套娃是有限的&#xff0c;同样&#xff0c;递归也是有限的&#xff0c;这和我们经…

算法设计中的基础常用代码

引言 本篇博客旨在记录一些基础算法知识的常见组合用法&#xff0c;以及何时使用&#xff0c;需要注意的问题等&#xff0c;长期更新。 为什么要这样总结呢&#xff1f;难道掌握了位运算、常用算法工具API的定义还不够吗&#xff1f; 这是因为某些知识比如 &、 |、 ~、 …

Redis —— 常用命令一览

引言 参考《菜鸟教程 Redis 常用命令》&#xff0c;其中红色为极其重要&#xff0c;蓝色为重要。 一、总览 二、key相关命令 三、String 相关命令 四、Hash 相关命令 五、List 相关命令 六、Set 相关命令 七、ZSet 相关命令

Redis 实用技术——Pipeline

引言 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。 这意味着通常情况下一个请求会遵循以下步骤&#xff1a; 客户端向服务端发送一个查询请求&#xff0c;并监听Socket返回&#xff0c;通常是以阻塞模式&#xff0c;等待服务端响应。服务端处理命令&#x…

Redis 实用技术——消息发布和订阅

引言 发布订阅模型是redis的重要功能&#xff0c;它可以像网站动态一样&#xff0c;将消息发送到多个订阅者的主页里。 一、常用命令 二、消息格式 消息是一个有三个元素的多块响应&#xff1a; 如上图&#xff0c;发布者向 mysub 频道发送了一条消息&#xff0c;redis会返回…

Redis 实用技术——事务

引言 redis的事务不像关系型数据库的事务那样完整。 “快”是redis的特征&#xff0c;在事务管理的过程中&#xff0c;使用muti命令开启事务块&#xff0c;当输入多条命令后&#xff0c;再使用exec命令执行事务块中的全部命令。 Redis事务可以保证两件事&#xff1a; 1、隔…

排序算法——归并排序的相关问题

一、小和问题 问题描述&#xff0c;给定一个数组&#xff0c;如[1, 3, 2, 6, 5]&#xff0c;计算每个数左边小于自己的所有数的和&#xff0c;并累加。例如&#xff1a; 1左边没有数 3左边有一个小于自己的数 1 2左边有一个小于自己的数 1 6左边有三个小于自己的数 1 3 2 6…

排序算法——随机快速排序

引言 随机快排是一个非常有意思的排序排序算法&#xff0c;它的算法思想用到了如递归、荷兰国旗问题等诸多元素&#xff0c;还意外的引入了随机性的概念。 以下将逐步总结三个版本的快速排序&#xff0c;由浅入深总结快速排序的经典实现过程。 荷兰国旗问题参考&#xff1a;…

Redis 基础——五大类型与数据结构

引言 Redis 区分于 memcahced 的一个重要不同就是它具有明确的类型概念&#xff0c;在Redis 的使用过程中&#xff0c;都离不开这些类型的学习&#xff0c;它不仅是 Redis 能力的基础&#xff0c;同时也是一些重要数据结构和算法思想的体现。 本博客总结了五大类型的书面重点…

比较器的使用

一、TreeMap 实现排序 TreeMap是一个有序结构&#xff0c;TreeSet也是类似。 他们可以实现对元素的排序。TreeMap 是针对 key进行排序。 如果TreeMap的key 是Integer类型&#xff0c;可以无需指定任何特殊条件&#xff0c;默认即按照升序进行排序&#xff0c;如&#xff1a;…

经典数据结构——堆的实现

一、完全二叉树 堆是一种完全二叉树&#xff0c;什么是完全二叉树&#xff1f; 简单的说&#xff0c;一棵满二叉树表示的是所有节点全部饱和&#xff0c;最后一层全部占满&#xff1a; 而完全二叉树指的是满二叉树的最后一层&#xff0c;所有叶子节点都从左往顺序排满&#x…

排序算法 —— 堆排序

引言 此文基于《经典数据结构——堆的实现》中堆结构&#xff0c;实现一个以堆处理排序的算法。 一、算法思想 基于堆结构的堆排序的算法思想非常简单&#xff0c;循环获取大根堆中的最大值&#xff08;0位置的根节点&#xff09;放到堆的末尾&#xff0c;直到将堆拿空。 由…

经典数据结构——前缀树

引言 前缀树——trie /ˈtraɪ//树&#xff0c;也叫作“单词查找树”、“字典树”。 它属于多叉树结构&#xff0c;典型应用场景是统计、保存大量的字符串&#xff0c;经常被搜索引擎系统用于文本词频统计。它的优点是利用字符串的公共前缀来减少查找时间&#xff0c;最大限度…

排序算法 —— 计数排序

引言 计数排序是桶排序思想的一种具体实现&#xff0c;针对一些具有特殊限制的样本数据&#xff0c;如公司员工年龄&#xff0c;那么样本数据本身就一定在0~200之间&#xff0c;针对这样的数据&#xff0c;使用从0到200 的桶数组&#xff0c;桶的位置已经是有序的&#xff0c;…

Java多线程 —— 线程状态迁移

引言 线程状态迁移&#xff0c;又常被称作线程的生命周期&#xff0c;指的是线程从创建到终结需要经历哪些状态&#xff0c;什么情况下会出现哪些状态。 线程的状态直接关系着并发编程的各种问题&#xff0c;本文就线程的状态迁移做一初步探讨&#xff0c;并总结在何种情况下…

Java中的Unsafe

Java和C语言的一个重要区别就是Java中我们无法直接操作一块内存区域&#xff0c;不能像C中那样可以自己申请内存和释放内存。Java中的Unsafe类为我们提供了类似C手动管理内存的能力。 Unsafe类&#xff0c;全限定名是sun.misc.Unsafe&#xff0c;从名字中我们可以看出来这个类对…

Java 写时复制容器 —— CopyOnWriteArrayList

引言 写时复制的含义是当容器发生修改操作时&#xff0c;如add() 等&#xff0c;就会将原来的容器整体复制一份&#xff0c;这个过程是加锁的。而如果只是读取资源&#xff0c;例如 get() &#xff0c;就不会受到任何同步要求的限制。 写时复制的理念是&#xff0c;如果多个读…

arm中断保护和恢复_浅谈ARM处理器的七种异常处理

昨天的文章&#xff0c;我们谈了ARM处理器的七种运行模式&#xff0c;分别是&#xff1a;用户模式User(usr)&#xff0c;系统模式System(sys)&#xff0c;快速中断模式(fiq)&#xff0c;管理模式Supervisor(svc)&#xff0c;外部中断模式(irq)&#xff0c;数据访问中止模式Abor…

Queue —— JUC 的豪华队列组件

目录引言一、Queue 的继承关系1.1 Queue 定义基础操作1.2 AbstractQueue 为子类减负1.3 BlockingQueue 阻塞式Queue1.4 Deque 两头进出二、Queue 的重要实现三、BlockingQueue 的实现原理四、Queue 在生产者消费者模式中的应用五、Queue 在线程池中的应用六、ConcurrentLinkedQ…