Java自定义LinkedList类如何实现链表节点两两交换顺序?
两两交换节点实现方案
核心思路
- 你触发空指针报错的核心原因是遍历逻辑未做有效边界判断,直接访问了null节点的
next属性,结合你当前带哨兵头节点(LinkedList的first为固定null哨兵,first.next为第一个有效节点)的结构,按如下逻辑实现即可:
- 初始化两个指针:
prev指向哨兵节点first,curr指向第一个有效节点first.next - 循环终止条件设置为
curr != null && curr.next != null,只要满足其一就停止循环,自动兼容奇数长度链表末尾节点不动的需求 - 每轮循环提前缓存当前组的第二个节点、下一组的起始节点,避免交换后指针丢失
- 完成节点交换后移动指针到下一组,重复操作直到循环终止
- 最后更新
last指针即可补全链表属性维护逻辑
具体实现代码
将以下方法添加到LinkedList类中即可:
public void swapPairs() { LinkedListElement prev = first; LinkedListElement curr = first.next; // 循环条件保证当前处理组存在两个有效节点,避免空指针 while (curr != null && curr.next != null) { // 提前缓存节点,避免交换后指针丢失 LinkedListElement secondInCurrPair = curr.next; LinkedListElement firstInNextPair = secondInCurrPair.next; // 执行节点交换 prev.next = secondInCurrPair; secondInCurrPair.next = curr; curr.next = firstInNextPair; // 指针移动到下一组 prev = curr; curr = firstInNextPair; } // 维护last指针属性 last = curr != null ? curr : prev; }
常见空指针触发原因
绝大多数
无法获取null的.next属性报错都来自以下两个问题:
- 循环条件仅判断了
curr != null,未判断curr.next != null,当curr是链表最后一个节点时,访问curr.next就会触发空指针- 未提前缓存下一组的起始节点,交换完当前组节点后指针指向混乱,后续遍历误访问null节点的
next属性
内容的提问来源于stack exchange,提问作者Major_Uff
相关产品推荐
相关产品推荐

