删除给定链表中的重复元素(链表中元素从小到大有序排列),使链表中的所有元素都只出现一次,C语言实现
时间: 2024-04-30 09:21:31 浏览: 155
假设链表节点的结构体如下:
```c
struct ListNode {
int val;
struct ListNode *next;
};
```
则可以按照以下步骤实现链表中重复元素的删除:
1. 如果链表为空或只有一个节点,直接返回链表。
2. 定义一个指针p,初始指向链表的第一个节点。
3. 遍历链表,如果当前节点的值和下一个节点的值相等,则删除下一个节点(即将当前节点的next指针指向下一个节点的next指针),继续判断下一个节点。如果不相等,则将p指针指向下一个节点,继续遍历。
4. 返回链表的头节点。
具体代码实现如下:
```c
struct ListNode* deleteDuplicates(struct ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode *p = head;
while (p->next != NULL) {
if (p->val == p->next->val) {
p->next = p->next->next;
} else {
p = p->next;
}
}
return head;
}
```
相关问题
java 删除给定链表中的重复元素(链表中元素从小到大有序排列),使链表中的所有元素都只出现一次 一行内输入一串整数,以空格间隔,以# 结束 一串去重后整数,以空格间隔,以# 结束。
您可以使用Java中的链表来实现删除给定链表中的重复元素。以下是一个示例代码:
```java
import java.util.*;
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
String[] numbers = input.split(" ");
ListNode head = new ListNode(Integer.parseInt(numbers[0]));
ListNode current = head;
for (int i = 1; i < numbers.length; i++) {
int num = Integer.parseInt(numbers[i]);
current.next = new ListNode(num);
current = current.next;
}
ListNode uniqueList = removeDuplicates(head);
StringBuilder result = new StringBuilder();
while (uniqueList != null) {
result.append(uniqueList.val).append(" ");
uniqueList = uniqueList.next;
}
System.out.println(result.toString().trim());
}
private static ListNode removeDuplicates(ListNode head) {
if (head == null) {
return null;
}
ListNode current = head;
while (current != null && current.next != null) {
if (current.val == current.next.val) {
current.next = current.next.next;
} else {
current = current.next;
}
}
return head;
}
}
```
在代码中,我们首先将输入的一行数字按空格分隔成一个字符串数组。然后,我们根据数字数组创建链表,并使用`removeDuplicates()`方法删除重复的元素。最后,我们将去重后的链表转换为字符串,并打印输出。
希望能帮到您!如果您还有其他问题,请随时提问。
删除给定链表中的重复元素(链表中元素从小到大有序排列),使链表中的所有元素都只出现一次 例如: 给定的链表为1->1->2,返回1->2 给定的链表为1->1->2->3->3,返回1->2->3 数据范围:链表长度满足 0≤n≤100,链表中任意节点的值满足 ∣val∣≤1000 要求:空间复杂度 O(1),时间复杂度 O(n) 输入描述 一行内输入一串整数,以空格间隔,以# 结束。 输出描述 一串去重后整数,以空格间隔,以# 结束。
好的,下面是 Python3 代码实现:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def deleteDuplicates(head: ListNode) -> ListNode:
if not head or not head.next:
return head
p1, p2 = head, head.next
while p2:
if p1.val == p2.val:
p2 = p2.next
else:
p1.next = p2
p1 = p2
p2 = p2.next
p1.next = None
return head
# 读入链表
nums = input().split()
head = ListNode(int(nums[0]))
p = head
for i in range(1, len(nums)-1):
p.next = ListNode(int(nums[i]))
p = p.next
# 删除重复元素
head = deleteDuplicates(head)
# 输出去重后的整数
res = ''
p = head
while p:
res += str(p.val) + ' '
p = p.next
res += '#'
print(res)
```
输入样例:
```
1 1 2 #
```
输出样例:
```
1 2 #
```
输入样例:
```
1 1 2 3 3 #
```
输出样例:
```
1 2 3 #
```
阅读全文