给定一个已排序的链表的头 head,删除所有重复的元素,使每个元素只出现一次。返回 已排序的链表。示例 1:输入: head =[1,1,2],输出:[1,2]
时间: 2024-05-16 17:14:00 浏览: 58
可以使用双指针来解决这个问题。一个指针指向当前已经处理好的不重复的节点的末尾,另一个指针用来遍历链表并查找重复的节点。
具体地,我们用指针 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
```
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 cyu语言实现
给定一个已排序的链表,删除其中的所有重复元素,可以使用双指针法,即维护两个节点,一个指向当前节点,另一个指向当前节点的下一个节点。如果当前节点的值等于下一个节点的值,则不断移动下一个节点,直到找到不同的值,然后将当前节点的next指向这个新位置。遍历完成后,最后一个非重复节点就是新的链表头。
以下是Cyu语言(可能需要翻译成C++或Python等常见编程语言才能运行)的一个简化版本的实现:
```cyu
// 定义链表节点结构
typedef struct ListNode {
int val;
ListNode* next;
} ListNode;
ListNode* deleteDuplicates(ListNode* head) {
if (head == nullptr || head->next == nullptr) { // 如果链表为空或只有一个元素
return head;
}
ListNode* current = head; // 初始化当前节点为头节点
while (current != nullptr && current->next != nullptr) {
if (current->val == current->next->val) { // 如果当前节点的值等于下一个节点的值
ListNode* temp = current->next;
while (temp != nullptr && temp->val == current->val) { // 移动到下一个不同的节点
temp = temp->next;
}
current->next = temp; // 更新当前节点的next为非重复节点
} else {
current = current->next; // 否则直接移动到下一个节点
}
}
return head;
}
阅读全文