删除单链表中绝对值重复的元素

本文介绍了一种高效的单链表中绝对值重复元素的删除算法,利用辅助数组实现O(N)的时间复杂度,避免了传统方法的多次遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
问题描述:删除单链表中绝对值重复的元素。如:(21,-15,-15,-7,15)->(21,-15,-7)
说明:其实这题比较好的思路还是以前说的,以空间换时间。还是以前说的分类,把归属于一类的当成一种情况(这里是绝对值相同的元素),看它们能不能有相同的容易被检测到操作,在这里是把辅助数组对应位置加1。这样的话,遍历一遍就可以完成问题,时间复杂度是O(N),普通的算法,来回重复遍历,复杂度是O(N2)。不过还是老问题,这里需要元素的绝对值的最大值不能太大因为这是辅助数组是根据元素绝对值的最大值申请空间的。

*/

//筛选链表中绝对值重复的元素
void FiltrateRep(LinkList &L)
{
    int temp[MAXSIZE];      //辅助元素

    memset(temp,0,sizeof(int)*MAXSIZE);     //初始化为0

    LNode *pre = NULL,*p =NULL ;

    pre = L;
    while(pre->next != NULL)
    {
        p = pre->next;

        if( p!= NULL)
        {
             if(temp[abs(p->data)] < 1)
             {
                  ++temp[abs(p->data)];        //辅助数组对应元素位置+1
                  pre = p;
             }
             else       //如果temp[p->data]大于1,正在判断的元素,是重复元素,需要删除
             {
                 pre->next = p->next;   //删除重复的元素

                 delete p;
             }
        }

    }

}

总结:其实以前做顺序结构的线性表的时候,明明总结过这种思路,到这里又没想到,还是不能融会贯通。还得修炼啊。

### Python 单链表去重实现方法 在 Python 中,可以通过多种方式对单链表进行去重操作。以下是基于题目描述的一种具体实现方案。 #### 方法概述 为了完成单链表的去重功能,通常会采用辅助集合(`set`)来记录已经访问过的节点值。通过遍历整个链表并检查当前节点值是否已存在于该集合中,决定是否保留此节点或将它移除到另一个存储删除节点的新链表中[^4]。 #### 数据结构定义 首先需要定义单链表的基本数据结构 `Node` 和 `MyLinkedList` 类: ```python class Node: def __init__(self, data=None): self.data = data self.next = None class MyLinkedList: def __init__(self): self.head = None def append(self, data): new_node = Node(data) if not self.head: self.head = new_node return last = self.head while last.next: last = last.next last.next = new_node def display(self): elements = [] current_node = self.head while current_node: elements.append(current_node.data) current_node = current_node.next return elements ``` #### 去重函数实现 下面是一个具体的去重逻辑实现代码片段: ```python def remove_duplicates_with_abs(linked_list): seen_values = set() deleted_nodes_linkedlist = MyLinkedList() prev = None current = linked_list.head while current is not None: abs_value = abs(current.data) if abs_value in seen_values: # 如果发现重复项,则将其移动至新链表 if prev: prev.next = current.next temp_deleted_node = Node(current.data) if not deleted_nodes_linkedlist.head: deleted_nodes_linkedlist.head = temp_deleted_node else: tail = deleted_nodes_linkedlist.head while tail.next: tail = tail.next tail.next = temp_deleted_node else: # 否则加入seen_values集合并继续前进 seen_values.add(abs_value) prev = current current = current.next return (linked_list.display(), deleted_nodes_linkedlist.display()) ``` 上述代码实现了如下几个核心步骤: 1. 创建一个空集合用于跟踪所有遇到的独特绝对数值; 2. 遍历原始链表中的每一个节点; 3. 对于每个节点的数据部分取其绝对值并与已有集合对比; 4. 若存在相同绝对值,则将该节点从原链表断开连接,并附加到一个新的专门用来保存这些被删掉节点的链表上;反之更新集合内容并向下一个节点推进。 #### 测试样例 假设输入初始状态为 L=21→-15→-15→-7→15 的情况下的测试过程如下所示: ```python if __name__ == "__main__": myLinkedList = MyLinkedList() values_to_insert = [21,-15,-15,-7,15] for value in values_to_insert: myLinkedList.append(value) result_after_removal, removed_elements = remove_duplicates_with_abs(myLinkedList) print("After Removal:",result_after_removal) print("Removed Elements:",removed_elements) ``` 执行结果应显示去除后的主链表序列以及收集起来的所有因违反唯一性条件而被淘汰下来的元素组成的副链表。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值