给定一个已排序的链表的头 head,删除所有重复的元素,使每个元素只出现一次。返回 已排序的链表。示例 1:输入: head =[1,1,2],输出:[1,2]
时间: 2024-05-16 17:14:00 浏览: 65
可以使用双指针来解决这个问题。一个指针指向当前已经处理好的不重复的节点的末尾,另一个指针用来遍历链表并查找重复的节点。
具体地,我们用指针 cur 来遍历链表。如果 cur 和 cur.next 对应的元素相同,那么我们就将 cur.next 从链表中移除,这样就保证了每个元素只出现一次。如果 cur 和 cur.next 对应的元素不同,则将 cur 指向 cur.next。这样,当 cur 遍历完整个链表后,链表中就只剩下不重复的节点了。
下面是具体的代码实现:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def deleteDuplicates(head: ListNode) -> ListNode:
if not head:
return None
cur = head
while cur.next:
if cur.val == cur.next.val:
cur.next = cur.next.next
else:
cur = cur.next
return head
```
时间复杂度是 O(n),其中 n 是链表的长度。空间复杂度是 O(1)。
相关问题
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
当你需要从已排序的链表中删除所有重复的元素并保持链表有序时,可以采用双指针法。首先,创建两个指针,一个指向当前节点(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。
阅读全文