不使用Java内置数组、List等,如何将同类型对象存储到另一类中?
自定义双向链表实现思路
你已经完成的双向节点ListItem可以直接复用,只需要再封装一个CustomLinkedList类统一管理所有节点即可,具体实现逻辑如下:
1. 基础成员定义
CustomLinkedList只需要存储头节点、尾节点和元素计数三个核心属性,不需要提前申请固定大小的存储空间,天然支持动态扩容:
public class CustomLinkedList { // 指向链表第一个节点 private ListItem head; // 指向链表最后一个节点 private ListItem tail; // 记录当前链表存储的元素总数 private int size; // 初始化空链表 public CustomLinkedList() { head = null; tail = null; size = 0; } // 获取当前元素数量 public int getSize() { return size; } // 判断链表是否为空 public boolean isEmpty() { return size == 0; } }
2. 核心增删方法实现
尾部添加元素(默认添加逻辑)
// 向链表末尾添加新元素 public void add(String value) { ListItem newNode = new ListItem(value); if (isEmpty()) { // 空链表时新节点既是头也是尾 head = newNode; tail = newNode; } else { // 关联原尾节点和新节点 tail.setNextItem(newNode); newNode.setPreviousItem(tail); // 更新尾节点指针 tail = newNode; } size++; }
其他增删逻辑(头部添加、指定位置插入、删除指定元素等)只需要对应调整前后节点的nextItem、previousItem指针,同时更新size计数即可。
3. 双向遍历能力实现
可以直接内置遍历方法,也可以实现自定义迭代器对外暴露遍历能力:
内置正反遍历方法
// 正向遍历(从头部到尾部) public void printForward() { ListItem current = head; while (current != null) { System.out.println(current.getValue()); current = current.getNextItem(); } } // 反向遍历(从尾部到头部) public void printBackward() { ListItem current = tail; while (current != null) { System.out.println(current.getValue()); current = current.getPreviousItem(); } }
自定义迭代器实现
如果需要类似Java标准集合的迭代器用法,可以新增内部迭代器类:
public ListIterator iterator() { return new ListIterator(); } public class ListIterator { private ListItem current = head; // 判断是否有下一个元素 public boolean hasNext() { return current != null; } // 获取下一个元素 public String next() { String val = current.getValue(); current = current.getNextItem(); return val; } // 判断是否有上一个元素 public boolean hasPrevious() { return current != null; } // 获取上一个元素 public String previous() { String val = current.getValue(); current = current.getPreviousItem(); return val; } }
动态特性说明
链表结构本身不需要固定容量,每次新增元素时才会创建节点对象,只要JVM内存充足就可以一直新增元素,size计数会随元素增删自动更新,完全满足动态调整大小的需求。
内容的提问来源于stack exchange,提问作者Sapunaru Teodor
相关产品推荐
相关产品推荐

