有一个非空整数单链表L,设计一个算法删除值重复的节点,多个值相同的节点仅保留第一个。
时间: 2024-06-12 22:10:28 浏览: 118
好的,针对你的问题,我可以给出以下算法:
1. 定义一个集合set,用于存储已经出现过的节点值。
2. 遍历链表L,对于每个节点,判断其值是否已经在集合set中出现过。
3. 如果已经出现过,则删除该节点;否则将该节点的值加入集合set中。
4. 遍历完链表L后,所有重复的节点都已经被删除。
以下是Python代码实现:
```
def delete_duplicates(head):
if not head:
return head
seen = set()
seen.add(head.val)
prev = head
curr = head.next
while curr:
if curr.val in seen:
prev.next = curr.next
else:
seen.add(curr.val)
prev = curr
curr = curr.next
return head
```
相关问题
有一个非空整数单链表L,设计一个算法删除值重复的节点,多个值相同的节点仅保留第一个。 测试时输入 8 1 4 1 2 2 1 3 4后输出1 4 2 3用c语言实现上述程序
要实现这个功能,可以遵循以下步骤:
1. 定义一个指向链表结点的结构体和一个指针来指向当前结点(头结点)[^1]:
```c
// Define a node structure
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
```
2. 创建并初始化一个链表,这里采用CreateListTail方法来构建含有重复值的链表:
```c
ListNode* CreateListWithDuplicates(int* arr, size_t len) {
ListNode* head = NULL, *tail = NULL;
ListNode** current = &head;
// 使用尾插法定位新节点
for (int i = 0; i < len; ++i) {
if (!head || arr[i] > (*current)->val) {
*current = (ListNode*)malloc(sizeof(ListNode));
(*current)->val = arr[i];
(*current)->next = tail;
tail = *current++;
} else if (arr[i] == (*current)->val) {
// 如果值相同,则忽略之后的重复节点
}
}
return head;
}
```
3. 删除值重复的节点,仅保留第一个:
```c
void RemoveDuplicates(ListNode** node_ref) {
ListNode* current = *node_ref;
ListNode* prev = NULL;
while (current != NULL) {
ListNode* next_temp = current->next;
if (prev && current->val == prev->val) {
free(current); // 对已重复节点进行删除
prev->next = next_temp;
} else {
prev = current;
current = next_temp;
}
}
}
```
测试示例:
```c
int main(void) {
int input[] = {8, 1, 4, 1, 2, 2, 1, 3, 4};
size_t n = sizeof(input) / sizeof(input[0]);
ListNode* result_list = CreateListWithDuplicates(input, n);
RemoveDuplicates(&result_list);
// 希望输出的链表: 1->4->2->3
// 输出实际内容需根据你的链表操作逻辑实现
...
return 0;
}
```
注意,上面的代码没有包含打印链表的功能,你可能需要根据需求添加一个适当的辅助函数用于展示输出链表。输出的具体链表表示需要额外实现链表的访问和显示操作。
有一个非空整数单链表L,设计一个算法删除值重复的节点,多个值相同的节点仅保留第一个。 输入 8 1 4 1 2 2 1 3 4 输出 1 4 2 3 样例输入 8 1 4 1 2 2 1 3 4 样
这是一个经典的链表问题,需要我们遍历链表并跟踪每个节点的值是否已经出现过。如果遇到重复的值,我们可以跳过后面的同值节点。以下是解决方案的大致步骤:
1. 定义一个辅助结构,比如`VisitedNode`,用于记录每个已访问过的节点及其对应的值。
2. 创建两个指针,一个指向链表头(`head`),另一个(`current`)初始化为`NULL`。
3. 当`current`不为空时,比较`current->val`和`visited`中的值。如果不同,将当前节点添加到结果链表并将`visited`更新为当前节点;如果相同,则直接移动`current`到下一个节点。
4. 遍历完成后,将`head`设置为结果链表的第一个节点。
Python伪代码示例:
```python
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
visited = {None: None}
dummy = ListNode(0)
dummy.next = head
current = head
while current:
if current.val not in visited:
visited[current.val] = current
current = current.next
else:
next_to_visit = visited[current.val].next
visited.pop(current.val)
current.next = next_to_visit
current = next_to_visit
return dummy.next
```
在这个例子中,输入是一个包含重复值的链表,输出则是去掉了重复值的新链表,只保留了第一次出现的节点。样例输入和输出描述了一个具体的使用场景。
阅读全文