给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
时间: 2024-10-14 12:07:42 浏览: 47
当你需要从已排序的链表中删除所有重复的元素并保持链表有序时,可以采用双指针法。首先,创建两个指针,一个指向当前节点(p),另一个初始化为头节点(prev)。遍历链表:
1. 如果当前节点(p)的值等于前一个节点(prev)的值,说明这个值已经出现过,将前一个节点(prev)的next指向前一个节点(prev),即删除当前节点。
2. 如果当前节点(p)的值不同于前一个节点(prev),将前一个节点(prev)更新为当前节点(p),因为新的值不再重复。
3. 遍历结束后,前一个节点(prev)的下一个节点就是链表的新头。
以下是伪代码形式:
```
def deleteDuplicates(head):
if not head or not head.next:
return head
prev = None
curr = head
while curr:
if prev and curr.val == prev.val:
prev.next = curr.next
else:
prev = curr
curr = curr.next
return head
```
相关问题
用c语言实现给定一个已排序的链表的头 head,删除所有重复的元素,使每个元素只出现一次。返回 已排序的链表。
以下是用C语言实现的代码:
```c
struct ListNode* deleteDuplicates(struct ListNode* head) {
if (head == NULL) {
return NULL;
}
struct ListNode* cur = head;
while (cur->next != NULL) {
if (cur->val == cur->next->val) {
struct ListNode* temp = cur->next;
cur->next = cur->next->next;
free(temp);
} else {
cur = cur->next;
}
}
return head;
}
```
这段代码使用了双指针的方法,遍历链表中的每个节点,如果当前节点的值等于下一个节点的值,就将下一个节点删除,直到链表末尾。最后返回已排序的链表。
需要注意的是,当删除节点时需要释放节点的内存空间,以免出现内存泄漏问题。同时,需要考虑链表为空的情况,如果链表为空,则直接返回NULL。
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。写出C语言代码
当你需要从一个已排序的链表中删除重复元素并保持链表有序时,可以采用双指针策略,同时遍历链表。这里是一个简单的C语言解决方案:
```c
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* deleteDuplicates(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head; // 如果链表为空或只有一个元素,则无需处理
}
ListNode* slow = head;
ListNode* fast = head->next;
while (fast != NULL && fast->next != NULL) { // 使用两个指针,slow移动一步,fast移动两步
if (fast->val != slow->val) { // 如果值不同,将slow指向的节点移到下一个位置
slow->next = fast;
}
fast = fast->next->next; // 快速指针前进一步
}
if (fast != NULL && fast->val == slow->val) { // 处理最后一个可能存在的重复节点
slow->next = fast->next;
} else {
slow->next = NULL; // 如果只剩一个元素或已经到达链表尾部,将慢指针设为NULL
}
return head;
}
```
这个函数会遍历链表,如果当前节点的值等于下一个节点的值,就跳过下一个节点;如果不等,则将当前节点的`next`指向前一个节点。最后返回新的头节点。
阅读全文