Java链表:实现重复值相邻排列且保留输入顺序的方法需求
问题分析
你的当前方法核心逻辑是将新元素插入到链表的合适位置以维持整体升序排列,这就是为什么最终链表是从小到大排序的,完全不符合你想要的「保留输入顺序,仅将重复值相邻放置」的需求。
看你的期望输出:
User input: 5 Linked list: [5,]
User input: 4 Linked list: [5,4]
User input: 3 Linked list: [5,4,3]
User input: 5 Linked list: [5,5,4,3]
User input: 3 Linked List: [5,5,4,3,3]
核心需求可以拆解为:
- 新元素如果是首次出现,直接追加到链表末尾,严格保留输入顺序
- 新元素如果已经存在,插入到最后一个相同元素的后面,让重复值相邻,同时不打乱其他元素的原有顺序
修改后的实现
下面是完全符合你需求的addValue方法:
private static void addValue(int val) { if (llist.size() == 0) { llist.add(val); } else { // 遍历链表,记录最后一个与当前值匹配的元素索引 int lastMatchIndex = -1; for (int i = 0; i < llist.size(); i++) { if (llist.get(i) == val) { lastMatchIndex = i; } } if (lastMatchIndex != -1) { // 找到重复值,插入到最后一个匹配元素的后方 llist.add(lastMatchIndex + 1, val); } else { // 无重复值,直接追加到链表末尾 llist.add(val); } } }
代码逻辑说明
- 空链表的处理和原逻辑一致,直接添加元素
- 遍历链表时,我们会持续更新
lastMatchIndex,确保它指向最后一个和当前值相同的元素- 如果找到匹配项,把新元素插入到该索引的下一个位置,既保证了重复值相邻,又不会打乱其他元素的原有顺序
- 如果没找到匹配项,直接把新元素追加到链表末尾,完全遵循输入的先后顺序
测试验证
用你的测试输入跑这个方法,会得到你期望的输出:
User input: 5 Linked list: [5]
User input: 4 Linked list: [5, 4]
User input: 3 Linked list: [5, 4, 3]
User input: 5 Linked list: [5, 5, 4, 3]
User input: 3 Linked list: [5, 5, 4, 3, 3]
这样就完美满足了你的需求:重复值相邻排列,同时全程保留了原始的输入顺序,不会对整个链表进行额外排序。
内容的提问来源于stack exchange,提问作者mirkovski
相关产品推荐
相关产品推荐

