如何在双向链表头部添加新节点?并改造为泛型实现
修正双向链表并实现泛型支持与头部插入功能
问题分析
现有代码存在几个关键问题:
- SLList类未声明泛型,无法支持任意类型元素
- 内部节点类IntNode的data是int类型,只能存储整数,且泛型
<T>未实际使用 - 节点的previous/next未指定泛型类型,存在类型不安全问题
- addFirst方法缺少参数名,且未实现核心逻辑
完整修正代码
public class SLList<T> { // 内部泛型节点类,重命名为Node更贴合通用场景 private class Node { private T data; private Node previous; private Node next; public Node(T data, Node previous, Node next) { this.data = data; this.previous = previous; this.next = next; } } private Node firstSen; private Node lastSen; public SLList() { // 哨兵节点不需要存储有效业务数据,传入null即可 firstSen = new Node(null, null, null); lastSen = new Node(null, firstSen, null); firstSen.next = lastSen; } // 实现头部插入方法 public void addFirst(T item) { // 1. 创建新节点:前驱指向头哨兵,后继指向头哨兵原本的下一个节点 Node newNode = new Node(item, firstSen, firstSen.next); // 2. 调整原头哨兵后继节点的前驱指向新节点 firstSen.next.previous = newNode; // 3. 调整头哨兵的后继指向新节点,完成插入 firstSen.next = newNode; } // 可选:添加打印方法验证链表结构 public void printList() { Node current = firstSen.next; while (current != lastSen) { System.out.print(current.data + " "); current = current.next; } System.out.println(); } }
关键改动说明
- 泛型声明:给SLList类加上
<T>,表示这是一个支持任意引用类型的链表(若需支持基本类型,需使用对应包装类如Integer、Double等) - 节点类改造:将IntNode重命名为Node,把data类型从int改为T,让节点可以存储任意类型数据;同时明确previous和next的类型为Node,避免类型转换隐患
- 哨兵节点初始化:哨兵仅用于维护链表边界,无需存储业务数据,构造时传入null即可
- addFirst核心逻辑:通过三步指针调整,将新节点插入到头哨兵与原第一个节点之间,保证双向链表的结构完整性
使用示例
public class Main { public static void main(String[] args) { // 存储字符串的链表 SLList<String> strList = new SLList<>(); strList.addFirst("World"); strList.addFirst("Hello"); strList.printList(); // 输出:Hello World // 存储整数的链表 SLList<Integer> intList = new SLList<>(); intList.addFirst(2024); intList.addFirst(100); intList.printList(); // 输出:100 2024 } }
内容的提问来源于stack exchange,提问作者Nutnicha
相关产品推荐
相关产品推荐

