(一)题目要求:
给定一个排序链表,删除所有重复的元素每个元素只留下一个。
(二)示例:
给出 1->1->2->null
,返回 1->2->null
给出 1->1->2->3->3->null
,返回 1->2->3->null
(三)题解:
注意分析题设,给定的是已排序好的链表,复杂度降低;否则是否考虑用map??
方法一:
**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
//方法一:
//p_prev :删除结点的前结点 p_current : 当前结点
//遍历链表,如果值等于比较值,则删除该结点,更新当前结点指针
//如果值不等于比较值,则说明是新的值,更新比较值,前结点和当前结点指针后移
class Solution {
public:
/*
* @param head: head is the head of the linked list
* @return: head of linked list
*/
ListNode * deleteDuplicates(ListNode * head) {
// write your code here
if(!head)
return NULL;
ListNode *p_prev = head,*p_current = head->next;
int val_cmp = head->val;
while(p_current)
{
if(p_current->val == val_cmp)
{
p_prev->next = p_current->next;
delete p_current;
p_current = p_prev->next;
}
else
{
val_cmp = p_current->val;
p_prev = p_current;
p_current = p_current->next;
}
}
return head;
}
};
方法二:
//方法二:
//比较当前结点和当前结点的下一个结点,相等则当前结点指向下一个结点的下一个结点
//不等则当前结点指针后移
//(注意没有释放结点内存空间,否则需引入 tmp 指针保存删除结点的指针值)
class Solution{
public:
/**
* @param head: The first node of linked list.
* @return: head node
*/
ListNode *deleteDuplicates(ListNode *head) {
if (head == NULL) {
return NULL;
}
ListNode *node = head;
while (node->next != NULL) {
if (node->val == node->next->val) {
node->next = node->next->next;
} else {
node = node->next;
}
}
return head;
}
};