1 题目描述
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1→2→3→3→4→4→5, 返回1→2→5.
给出的链表为1→1→1→2→3, 返回2→3.
2 解题思路
见代码
3 代码实现
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* deleteDuplicates(ListNode* head) {
// write code here
if(head == NULL || head->next == NULL) // 如果链表只有0个节点或者1个节点
return head; // 则没有重复节点,则直接返回原链表
ListNode* head2 = new ListNode(-1); // 新定义一个链表
head2->next = head; // 将新定义的链表接上原链表
ListNode* pre = head2; // 定义靠前的节点为新链表的第一个节点
ListNode* cur = head; // 定义靠后的节点为原链表的第一个节点
while(cur != NULL && cur->next != NULL){ // 如果靠后的节点不为空,且其再往后的节点也不为空
if(cur->val != cur->next->val){ // 靠后的节点的值不等于其再往后的节点的值
pre = cur; // 则靠前的节点等于靠后的节点,所以靠前的节点代表前一个不重复的元素
}
else{ // 如果靠后的节点的值等于其再往后的节点的值
while(cur->next != NULL && cur->next->val == cur->val) // 如果其再往后的节点不为空,且其再往后的节点的值等于其的值
cur = cur->next; // 则靠后的节点变为其再往后的节点,逐渐往后
pre->next = cur->next; //
}
cur = cur->next; // 则靠后的节点变为其再往后的节点,逐渐处理
}
return head2->next;
}
};
4 运行结果
运行时间:3ms
占用内存:376k