题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
牛客链接:
https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef?tpId=13&&tqId=11209&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
解题思路:
目前提供两种方式,
第一种通过一个前指针和当前指针,找到重复节点并删除
第二种1.首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况2.设置 pre ,last 指针, pre指针指向当前确定不重复的那个节点,而last指针相当于工作指针,一直往后面搜索。
代码一:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead == NULL) return NULL;
ListNode* pTemp = pHead->next;
ListNode* pPre = pHead;
while(pTemp != NULL) {
//找到重复节点
if(pTemp->val == pPre->val) {
//将所有与该节点重复的节点找到并删除
while(pTemp->val == pPre->val) {
pTemp = pTemp->next;
pPre->next = pTemp;
if(pTemp == NULL) break;
}
//删除前一个重复的节点
ListNode* pTemp1 = pHead;
if(pPre == pHead) {
pHead = pTemp;
} else {
while(pTemp1->next != pPre) {
pTemp1 = pTemp1->next;
}
pTemp1->next = pPre->next;
}
pPre = pTemp;
if (pTemp != NULL) pTemp = pTemp->next;
} else {
pPre = pTemp;
pTemp = pTemp->next;
}
}
return pHead;
}
};
代码二:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead == NULL || pHead->next == NULL) return pHead;
ListNode* head = (ListNode*)malloc(sizeof(ListNode));
head->next = pHead;
ListNode* pPre = head;
ListNode* pLast = head->next;
while(pLast != NULL) {
if(pLast->next!=NULL && pLast->val == pLast->next->val) {
//找到最后的一个相同节点
while(pLast->next!=NULL && pLast->val == pLast->next->val) {
pLast = pLast->next;
}
pPre->next = pLast->next;
pLast = pLast->next;
} else {
pPre = pPre->next;
pLast = pLast->next;
}
}
return head->next;
}
};
注意:
添加头结点