本篇博客将为大家介绍一道经典的链表问题:删除链表中的重复节点。
题目描述
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
解题思路
由于链表已经排序,因此重复的节点一定是相邻的。可以使用双指针的方法遍历链表,判断相邻的节点是否相同,如果相同,则删除后面的节点。
具体实现步骤如下:
- 定义两个指针,分别指向链表的头节点和第二个节点。
- 遍历链表,如果两个指针指向的节点相同,则将后面的指针向后移动一位;如果不同,则将两个指针同时向后移动一位。
- 如果后面的指针为空,则说明链表已经遍历完毕;否则,将前面的指针的 next 指针指向后面的指针,然后将后面的指针向后移动一位。
- 重复步骤 2 和 3,直到链表遍历完毕。
代码实现
C++ 代码如下:
/**
- Definition for singly-linked list.
- struct ListNode {
-
int val;
-
ListNode *next;
-
ListNode(int x) : val(x), next(NULL) {}
- };
/
class Solution {
public:
ListNode deleteDuplicates(ListNode* head) {
if (head == NULL) {
return NULL;
}
ListNode* p = head;
ListNode* q = head->next;
while (q != NULL) {
if (p->val == q->val) {
q = q->next;
} else {
p->next = q;
p = q;
q = q->next;
}
}
p->next = NULL;
return head;
}
};
时间复杂度分析
由于只需要遍历一次链表,因此时间复杂度为 O(n),其中 n 是链表的长度。空间复杂度为 O(1)。