Java实现链表
3、链表
MyLinkedList 有一个头指针,一个尾指针,还有链表长度size
内有两个类,一个是实现了Iterator接口的迭代器类,另一个是Node类,其中Node数据结构中,==除了数据,还要有前一个Node和后一个Node变量。
双向循环链表
代码如下:
import java.util.Iterator; /** * 双向循环链表 * @author Administrator * @date 2022-09-11 22:57 */ public class MyLinkedList<E> implements Iterable<E>{ private Node<E> last; // 尾指针 private Node<E> first; // 头指针 private int size; // 链表长度 每次插入要 +1 @Override public Iterator<E> iterator() { return new MyIter() ; // 返回一个迭代器 } /** * 实现Iterator接口的迭代器类 */ class MyIter implements Iterator<E>{ int index = 0; // 从0开始遍历 @Override public boolean hasNext() { return index != size; //如果为真 就是还有下一个 } @Override public E next() { return get(index++); // 通过get方法得到链表的item值 } @Override public void remove() { } } /** * 节点类 * @param <E> */ private static class Node<E>{ E item; // 元素值 Node<E> prev; // 前一个Node Node<E> next; // 后一个Node public Node(Node<E> prev,E item,Node<E> next){ this.item=item; this.prev=prev; this.next=next; } } public boolean addLast (E element) { // 声明一个不变的尾结点 final Node<E> l = last; // 把item装入一个Node里 下面开始插入 Node<E> newNode = new Node<E>(l,element,null); // 先把尾结点指向新插入的结点 last = newNode; // 新插进来的就是最后一个 // 如果是这是第一个元素 那么头尾结点其实都是这个新结点 if (l == null) { first = newNode; // 把这个新结点赋值给头结点 }else{ l.next = newNode; // 如果不是新的 那么就正常指向下一个 } size ++; // 链表长度 +1 return true; } public E set (int index , E element) { // 先判断index在哪 Node<E> x = findNode(index); E oldValue = x.item; x.item = element; return oldValue; // 返回修改前的item值 } /** * 找到指定索引上的Node并返回 * @param index * @return */ private Node<E> findNode(int index){ if(index < (size >> 1) ) // 如果index索引 小于链表总长的一半 那就从前往后找 直到index位置 { Node<E> x = first; for(int i = 0 ; i < index; i++){ x = first.next; } return x; } // 如果index索引 大于链表总长的一半 那就从后往前找 直到index位置 Node<E> x = last; for(int i = size-1 ;i > index; i--){ x = last.prev; } return x; } /** * 获得值 * @param index * @return */ public E get(int index) { return findNode(index).item; } public static void main(String[] args) { MyLinkedList<String> myLinkedList = new MyLinkedList<String>(); myLinkedList.addLast("aaa1"); myLinkedList.addLast("aaa2"); myLinkedList.addLast("aaa3"); myLinkedList.addLast("aaa4"); myLinkedList.addLast("aaa5"); myLinkedList.set(0,"set"); myLinkedList.forEach (s -> { System.out.println(s); }); Iterator myIter = myLinkedList.iterator(); while (myIter.hasNext()){ System.out.println(myIter.next()); } } }
3.1、forEach
forEach( )方法是java8新增的一个遍历方法,它被定义在java.lang.Iterable
接口中。
List、Map、Set、Stream等接口都实现了这个方法,所以可以直接使用这些类的实例化对象调用forEach方法遍历元素。
比如遍历hashMap可以这么写:
items.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
遍历List可以这么写:
myList.forEach(s -> System.out.println(s));
好看请赞,养成习惯:) 本文来自博客园,作者:靠谱杨, 转载请注明原文链接:https://www.cnblogs.com/rainbow-1/p/16690489.html
欢迎来我的51CTO博客主页踩一踩 我的51CTO博客
文章中的公众号名称可能有误,请统一搜索:靠谱杨的秘密基地
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2021-09-13 【已解决】Hadoop未知的主机名master