如何在CD播放器双向链表中打印前驱节点与后继节点?
解决双向链表前驱/后继节点打印问题
嘿,我明白你现在的困惑啦——双向链表的previous和next属性明明就在那儿,但不知道怎么在打印的时候用上对吧?别担心,咱们结合你的CD播放列表场景一步步来~
首先,先确认你的DoubleNode类应该包含的核心属性(我猜你大概是这么定义的,如果有调整可以对应修改):
class DoubleNode { int trackNumber; // 曲目编号 String songName; // 歌曲名称 DoubleNode previous; // 前驱节点引用 DoubleNode next; // 后继节点引用 // 构造方法 public DoubleNode(int trackNumber, String songName) { this.trackNumber = trackNumber; this.songName = songName; this.previous = null; this.next = null; } }
方法一:遍历打印整个播放列表
你需要从链表的头节点(或者尾节点)开始逐个遍历,对每个节点,判断它的previous和next是否为null(处理边界:第一首没有上一首,最后一首没有下一首),然后取出对应节点的信息打印。
示例代码如下:
// 假设你的链表类中有head(头节点)和tail(尾节点)属性 public void printFullPlaylist() { DoubleNode current = head; if (current == null) { System.out.println("当前播放列表为空哦~"); return; } while (current != null) { // 处理上一首信息:如果前驱为null,显示"无",否则显示前驱的编号+名称 String prevTrack = current.previous == null ? "无" : current.previous.trackNumber + " - " + current.previous.songName; // 处理下一首信息:同理,后继为null则显示"无" String nextTrack = current.next == null ? "无" : current.next.trackNumber + " - " + current.next.songName; // 打印当前曲目详情 System.out.println("=== 曲目 " + current.trackNumber + " ==="); System.out.println("歌曲名称: " + current.songName); System.out.println("上一首: " + prevTrack); System.out.println("下一首: " + nextTrack); System.out.println("------------------------"); // 移动到下一个节点继续遍历 current = current.next; } }
方法二:根据用户输入的曲目编号,打印单条曲目的上下首
如果是用Scanner接收用户输入的曲目编号,再定位到对应节点打印上下首,可以这么写:
import java.util.Scanner; public void printTrackWithNeighbors() { Scanner scanner = new Scanner(System.in); System.out.print("请输入要查询的曲目编号:"); int targetTrack = scanner.nextInt(); DoubleNode current = head; boolean found = false; while (current != null) { if (current.trackNumber == targetTrack) { found = true; String prevTrack = current.previous == null ? "无" : current.previous.trackNumber + " - " + current.previous.songName; String nextTrack = current.next == null ? "无" : current.next.trackNumber + " - " + current.next.songName; System.out.println("\n=== 查询结果 ==="); System.out.println("曲目编号: " + current.trackNumber); System.out.println("歌曲名称: " + current.songName); System.out.println("上一首: " + prevTrack); System.out.println("下一首: " + nextTrack); break; } current = current.next; } if (!found) { System.out.println("未找到编号为" + targetTrack + "的曲目哦~"); } scanner.close(); }
核心逻辑总结
其实本质就是利用双向链表每个节点的previous和next引用,先判断是否为null(避免空指针异常),再根据情况打印对应的节点信息:
- 当
current.previous == null:说明这是链表的第一个节点,没有上一首 - 当
current.next == null:说明这是链表的最后一个节点,没有下一首 - 否则直接访问
current.previous或current.next的trackNumber和songName属性即可
内容的提问来源于stack exchange,提问作者Raphael Ramos
相关产品推荐
相关产品推荐

