c++实现链表1->2->3->3->4->4->5 处理后为 1->2->5
时间: 2023-05-15 12:04:58 浏览: 58
可以使用双指针法遍历链表,如果当前节点的值与下一个节点的值相同,则将指针指向下一个不同值的节点,否则将当前节点加入新链表中。具体实现可以参考以下代码:
```c
#include <stdio.h>
#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 *dummy = (ListNode *)malloc(sizeof(ListNode));
dummy->next = head;
ListNode *prev = dummy;
ListNode *curr = head;
while (curr != NULL) {
if (curr->next != NULL && curr->val == curr->next->val) {
while (curr->next != NULL && curr->val == curr->next->val) {
curr = curr->next;
}
prev->next = curr->next;
} else {
prev = curr;
}
curr = curr->next;
}
return dummy->next;
}
int main() {
ListNode *head = (ListNode *)malloc(sizeof(ListNode));
head->val = 1;
head->next = (ListNode *)malloc(sizeof(ListNode));
head->next->val = 2;
head->next->next = (ListNode *)malloc(sizeof(ListNode));
head->next->next->val = 3;
head->next->next->next = (ListNode *)malloc(sizeof(ListNode));
head->next->next->next->val = 3;
head->next->next->next->next = (ListNode *)malloc(sizeof(ListNode));
head->next->next->next->next->val = 4;
head->next->next->next->next->next = (ListNode *)malloc(sizeof(ListNode));
head->next->next->next->next->next->val = 4;
head->next->next->next->next->next->next = (ListNode *)malloc(sizeof(ListNode));
head->next->next->next->next->next->next->val = 5;
head->next->next->next->next->next->next->next = NULL;
ListNode *newHead = deleteDuplicates(head);
while (newHead != NULL) {
printf("%d ", newHead->val);
newHead = newHead->next;
}
printf("\n");
return 0;
}
```
输出结果为:1 2 5