《剑指Offer》学习笔记--面试题57:删除链表中重复的结点

来源:互联网 发布:linux cpu核心数 编辑:程序博客网 时间:2024/05/24 04:30

题目:在一个排序的链表中,如何删除重复的结点?

解决这个问题的第一步是确定删除的参数。当然这个函数需要输入待删除链表的头结点。头结点可能与后面的结点重复,也就是说头结点也可能被删除,因此函数函数应该声明为void deleteDuplication(ListNode** pHead),而不是void deleteDuplication(ListNdoe* pHead)。

接下来我们从头遍历整个链表。如果当前结点的值与下一个结点的值相同,那么它们就是重复的结点,都可以被删除。为了保证删除之后的链表仍然是相连的而没有中间断开,我们要把当前及诶单的前一个结点和后面值比当前结点的值要打的结点相连。我们要确保pPreNode要始终与下一个没有重复的结点连接在一起。

上述删除重复结点的过程可以用如下代码实现:

void deleteDuplication(ListNode **pHead){if(pHead == NULL || *pHead == NULL)return;ListNode* pPreNode = NULL;ListNode* pNode = *pHead;while(pNode != NULL){ListNode* pNext = pNode->m_pNext;bool needDelete = false;if(pNext != NULL && pNext->m_nValue == pNode->m_nValue)needDelete = true;if(!needDelete){pPreNode = pNode;pNode = pNode->m_pNext;}else{int value = pNode->m_nValue;ListNode* pToBeDel = pNode;while(pToBeDel != NULL && pToBeDel->m_nValue == value){pNext = pToBeDel->m_pNext;delete pToBeDel;pToBeDel = NULL;pToBeDel = pNext;}if(pPreNode == NULL)*pHead = pNext;elsepPreNode->m_pNext = pNext;pNode = pNext;}}}


0 0
原创粉丝点击