java linked list里的元素顺序反过来
发布时间:2025-05-22 03:21:20 发布人:远客网络
一、java linked list里的元素顺序反过来
1、定义一个LinkedList<Integer> templist= new LinkedList<>();来存储list里面的值,通过迭代list,将值插入在templist的头上,那么templist就是list的反转了,最后将templist赋值给list就行了!
2、LinkedList<Integer>list=newLinkedList<>();
3、LinkedList<Integer>templist=newLinkedList<>();
4、Iterator<Integer>it=list.iterator();
5、while(it.hasNext()&&i>=0){
6、从API中可以看到List等Collection的实现并没有同步化,如果在多线程应用程序中出现同时访问,而且出现修改操作的时候都要求外部操作同步化;调用Iterator操作获得的Iterator对象在多线程修改Set的时候也自动失效,并抛出java.util.ConcurrentModificationException。这种实现机制是fail-fast,对外部的修改并不能提供任何保证。
7、Iterator是工作在一个独立的线程中,并且拥有一个 mutex锁,就是说Iterator在工作的时候,是不允许被迭代的对象被改变的。
8、Iterator被创建的时候,建立了一个内存索引表(单链表),这个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错误。
9、List、Set等是动态的,可变对象数量的数据结构,但是Iterator则是单向不可变,只能顺序读取,不能逆序操作的数据结构,当 Iterator指向的原始数据发生变化时,Iterator自己就迷失了方向。
10、所以如果像下面这么写就会抛出异常java.util.ConcurrentModificationException
11、LinkedList<Integer>list=newLinkedList<>();
12、Iterator<Integer>it=list.iterator();
13、while(it.hasNext()&&i>=0){
二、Java链表ListNode的理解与操作技巧
1、深入理解Java链表——ListNode的奥秘与高效操作
2、链表,这位数据结构的低调明星,与数组并肩存在,但实现原理却大相径庭。Java中,ArrayList依托数组,而LinkedList则依托链表。链表的一大优势在于数据的动态添加和删除,但循环遍历效率却不如数组。它是一个由节点(Node)串联而成的线性结构,内存中的数据分布不连续,每个节点持有自己的数据和对下一个节点的引用,形成了链式连接。链表的主角——单向链表,仅有一个头节点(Head),所有的操作都是通过它进行的,无论是插入还是删除。
3、想象一下,就像一个看不见的线索,每个节点都持有指向下一个节点的线索,上图中,头节点就像这个链条的起点。有趣的是,添加节点的过程却从链尾开始,新节点被插入到当前尾节点之后,形成一个不断扩展的序列。每个节点都仅知道自己下一个节点的位置,这就是链表的魅力所在。
4、节点的构造精巧,由对象值(val或data)和指向下一个节点的引用(Node.next)构成,就像一个信息传递的接力赛,每个节点都承载着数据和传递的使命。以下是ListNode的精简版定义:
5、 ListNode(int val){ this.val= val;}
6、 ListNode(int val, ListNode next){ this.val= val; this.next= next;}
7、在MyList类中,链表的操作方法更是精细入微。添加节点(add)、删除指定节点(delete)、获取节点长度(size)、查找节点位置(find),以及通过下标获取节点(get),每个方法都展示了链表操作的灵活性和高效性。比如,delete方法通过遍历链表找到目标节点,然后更新节点连接,避免了数组需要移动大量元素的麻烦。
8、最后,别忘了链表还有个华丽转身的时刻——链表反转(reverse)。通过交换每个节点的前后节点,链表从头到尾的顺序来了个180度的大转弯,展示了链表操作的多样性和可能性。
9、链表,这个看似平凡的数据结构,实则蕴含着丰富的操作技巧和灵活性。通过熟练掌握ListNode,你将能在Java编程世界中游刃有余地处理各种数据操作,让代码更加高效且优雅。
三、Java 面试题:反转不可变列表
1、在Java面试中,针对反转不可变列表的问题,可以采取以下几种解决方案,并考虑其性能特点:
2、直接操作ArrayList的内部数组并反转:
3、总结:在实际编程中,应根据具体需求和性能要求选择最合适的方法。对于大规模列表的反转,可以考虑使用ArrayList并预先指定容量或直接操作内部数组并反转的方法。在追求性能的同时,也要考虑代码的可读性和可维护性。