项目场景:
提示:这里简述项目相关背景:
链表练习题
问题描述:
提示:这里描述项目中遇到的问题:
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
原因分析:
提示:这里填写问题的分析:
1.双指针,引入两个指针,始终保证一前一后,由于这是一个升序的链表,要出现重复元素,必然相邻,如果相邻的结点相等则删除前一个,若是两相邻的结点不相等,则将val赋值给前一个值,两指针同时往前移动,遍历一遍,就可以去除重复元素。(C)
2.由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素
从指针 cur 指向链表的头节点,随后开始对链表进行遍历。如果当前 cur 与 cur.next 对应的元素相同,那我们就将cur.next 从链表中移除;
否则说明链表中已经不存在其它与 cur 对应的元素相同的节点,因此可以将 cur 指向cur.next, 当遍历完整个链表之后,我们返回链表的头节点即可(C++)
解决方案:
提示:这里填写该问题的具体解决方案:
C:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head)
{
int val = 0;
struct ListNode* q;
struct ListNode* p;
if(NULL == head) return NULL;
val = head->val;
p = head;
q = head->next;
while(NULL != q)
{
if(val == q->val)
{
p->next = q->next;
free(q);
q = p->next;
}
else
{
val = q->val;
q = q->next;
p = p->next;
}
}
return head;
}
C++:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head)
{
if (!head) return head;
ListNode* cur = head;
while (cur->next) {
if (cur->val == cur->next->val)
{
cur->next = cur->next->next;
}
else
{
cur = cur->next;
}
}
return head;
}
};