【剑指Offer】面试题57:删除链表中重复的结点

来源:互联网 发布:捷通华声语音合成软件 编辑:程序博客网 时间:2024/06/05 06:35

一:题目描述

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

如  1->2->3->3->4->4->5

删除重复的结点后链表变成:

1->2->5


二:解题思路

如果当前节点的值与下一个结点的值相同,那么他们就是重复的结点,都可以被删除。

为了保证删除后链表仍然是相连的没有断开,我们要把当前节点的前一个节点和侯敏值比他大的结点相连。、


需要注意:

1.输入空链表

2.删除的结点可能是头结点

3.删除后链表可能为空。


三:代码实现

ListNode*  deleteRepeatNode(ListNode * head){if (head == NULL)return NULL;ListNode* deletedHead = head;ListNode* pPreNode = NULL;ListNode* pNode = head;while (pNode != NULL){ListNode* pNext = pNode->next;bool needDelete = false;if (pNext != NULL && pNext->val == pNode->val)needDelete = true;if (!needDelete){pPreNode = pNode;pNode = pNode->next;}else{int val = pNode->val;ListNode* pToBeDel = pNode;while (pToBeDel != NULL && pToBeDel->val == val){pNext = pToBeDel->next;//删除指针空间,并将指针置为NULL,防止野指针现象delete pToBeDel;pToBeDel = NULL;pToBeDel = pNext;}//原始头结点被删除if (pPreNode == NULL)deletedHead = pNext;elsepPreNode->next = pNext;pNode = pNext;}//else}//whilereturn deletedHead;}


阅读全文
0 0