题目描述
给定一个已排序的链表,删除所有具有重复数字的节点,只保留与原始链表不同的数字。例如,
给定1 - > 2 - > 3 - > 3 - > 4 - > 4 - > 5,返回1 - > 2 - > 5。
给定1 - > 1 - > 1 - > 2 - > 3,返回2 - > 3。
解题思路1
(1)添加一个新的节点作为伪头结点,最后返回伪头结点的next即可
(2)遍历整个链表,遇到当前节点与其next节点的值相同,则不向新建节点后添加,否则添加到新建节点之后,按顺序依次添加
代码示例
class Solution {
public:
ListNode *deleteDuplicates(ListNode *head) {
if (head == NULL) return NULL;
ListNode *preHead = new ListNode(0);
preHead->next = head;
ListNode *cur = preHead;
while (cur->next && cur->next->next) {//注意循环条件,缺一不可
ListNode *pre = cur->next;
ListNode *pnext = pre->next;
if (pre->val != pnext->val) {
cur->next = pre;
cur = pre;
}
else {
while (pnext && pre->val == pnext->val) {//注意循环条件,缺一不可
pnext = pnext->next;
}
cur->next = pnext;
}
}
return preHead->next;
}
};
解题思路2
不新增节点,采用递归方式调整节点
代码示例
class Solution {
public:
ListNode *deleteDuplicates(ListNode *head) {
if (head == NULL || head->next == NULL) return head;
if (head->val != head->next->val) {
head->next = deleteDuplicates(head->next);
return head;
} else {
int tmp = head->val;
while (head->val == tmp) {
head = head->next;
if (!head) {
return NULL;
}
}
return deleteDuplicates(head);
}
}
};