List 连续节点重复删除

本文介绍了一种使用Java实现从列表中去除重复元素的方法。通过遍历列表并检查目标列表是否已包含该元素来确保每个元素只出现一次。最终输出不包含重复项的有序列表。


public class Test {

/**
* @param args
*/
public static void main(String[] args) {

List<String> list=new ArrayList();
list.add("a");
list.add("b");
list.add("b");
list.add("e");
list.add("e");
list.add("c");
list.add("c");
list.add("c");
list.add("f");
list.add("f");
List<String> list1=new ArrayList();

Iterator it= list.iterator();

while(it.hasNext()){

String o=(String)it.next();

if(!list1.contains(o))

list1.add(o);

}

for(String s:list1)System.out.println(s);

}
在C语言中,从无序链表中删除重复节点是一个常见的问题。实现方法可以有多种,下面介绍几种经典的方式,并结合引用中的代码进行说明。 ### 方法一:使用双重循环 这种方法通过两个嵌套的循环来遍历链表,外层循环选择一个节点,内层循环检查该节点之后的所有节点是否与之重复[^1]。如果发现重复节点,则将其从链表中移除并释放内存。 #### 示例代码 ```c int list_delete_repeat(list* head) { list *pre, *del; list* temp = head->next; while (temp) { pre = temp; while (pre->next) { if (pre->next->data == temp->data) { del = pre->next; pre->next = del->next; free(del); } else { pre = pre->next; } } temp = temp->next; } return 0; } ``` ### 方法二:使用哈希表 为了提高效率,可以使用哈希表来记录已经出现过的元素值。这样只需要一次遍历来完成任务。每当遇到一个新节点时,检查其值是否已经在哈希表中存在;如果存在,则跳过该节点;否则,将该值添加到哈希表中[^2]。 #### 示例代码 ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; void removeDuplicates(Node* head) { if (!head) return; Node* current = head; Node* prev = NULL; int seen[10000] = {0}; // 假设数据范围不超过10000 while (current) { if (seen[current->data]) { Node* toDelete = current; prev->next = current->next; current = current->next; free(toDelete); } else { seen[current->data] = 1; prev = current; current = current->next; } } } ``` ### 方法三:排序后去重 虽然题目要求处理的是无序链表,但也可以先对链表进行排序(如归并排序),然后简单地遍历一次以删除连续重复项。这种方法的时间复杂度主要取决于排序算法[^2]。 #### 示例代码 ```c // 排序函数和合并两个有序链表的函数需要单独实现 Node* sortedMerge(Node* a, Node* b); void frontBackSplit(Node* source, Node** frontRef, Node** backRef); Node* mergeSort(Node* head) { if (!head || !head->next) return head; Node* fast; Node* slow; fast = head->next; slow = head; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; } Node* left = head; Node* right = slow->next; slow->next = NULL; return sortedMerge(mergeSort(left), mergeSort(right)); } void removeSortedDuplicates(Node** headRef) { Node* current = *headRef; if (!current) return; while (current->next) { if (current->data == current->next->data) { Node* nextNext = current->next->next; free(current->next); current->next = nextNext; } else { current = current->next; } } } ``` 这些方法各有优劣,选择哪一种取决于具体的应用场景和性能需求。对于小规模或简单的应用,双重循环可能就足够了;而对于大规模数据集或者频繁操作的情况,使用哈希表或排序后再去重可能是更好的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值