双向链表两种构造方法对比:自研代码是否具备可行性?
你的双向链表构造方法无法正常运行
你的代码存在关键问题:初始化顺序错误导致指针引用异常,无法形成正确的空链表结构。
问题分析
看你编写的构造方法代码:
public DoublyLinkedList() { header = new Node<>(null,null,trailer); trailer = new Node<>(null,header,null); }
当执行第一行header = new Node<>(null,null,trailer);时,trailer变量还未被赋值,此时它是null引用。这意味着header的next指针会被设置为null,而不是后续创建的trailer实例。
第二行创建trailer时,虽然把它的prev指针指向了header,但header的next依然是null,并没有指向trailer。这样双向链表没有形成空链表应有的结构(头尾节点需要互相指向对方),后续执行添加元素、遍历、删除等操作时,会因为指针不完整抛出空指针异常,或者出现逻辑错误。
对比标准实现
教材中的标准实现则是正确的:
public DoublyLinkedList() { header = new Node<>(null, null, null); // create header trailer = new Node<>(null, header, null); // trailer is preceded by header header.setNext(trailer); // header is followed by trailer }
它先初始化header,再创建trailer并让其prev指向header,最后显式将header的next设为trailer,确保头尾节点互相引用,形成了正确的空双向链表结构。
修正方案
你可以通过两种方式修正代码:
// 方案一:调整初始化顺序,确保创建header时trailer已存在 public DoublyLinkedList() { trailer = new Node<>(null, null, null); header = new Node<>(null, null, trailer); trailer.setPrev(header); } // 方案二:补全header的next指针设置 public DoublyLinkedList() { header = new Node<>(null,null,trailer); trailer = new Node<>(null,header,null); header.setNext(trailer); // 新增这一步,让header的next指向trailer }
内容的提问来源于stack exchange,提问作者Jiajun Li
相关产品推荐
相关产品推荐

