【剑指Offer】【链表】删除链表中重复的节点
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
A:当遍历到第一个值为重复的节点时,要有一个指针指向它的前一个节点
因为函数原型没有传二级指针进来,且头结点也有可能被删除,所以要构建一个新结点Head
用布尔型的flag_repeat判断是否有重复节点,若有重复节点则删除,若没有重复节点则移动指针
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if((pHead == nullptr) || (pHead->next == nullptr))
{
return pHead;
}
//因为没有传二级指针进来,且头结点也有可能被删除,所以构建一个新结点Head
ListNode *Head = new ListNode(0);
Head->next = pHead;
ListNode *pPrev = Head;
ListNode *pNode = pHead;
while(pNode != nullptr)
{
bool flag_repeat = false;//判断是否有重复结点
if((pNode->next != nullptr) && (pNode->val == pNode->next->val) )
{
flag_repeat = true;
}
//没有重复节点
if(flag_repeat == false)
{
pPrev = pNode;
pNode = pNode->next;
}
//有重复节点
else
{
ListNode *pDelete = pNode; //重复的节点不保留
while((pNode->next != nullptr) && (pNode->val == pNode->next->val))
{
pNode = pNode->next;
//只删了原来的那个
delete pDelete;
pDelete = pNode;
}
pPrev->next = pNode->next;
pNode = pNode->next;
//删第二个
delete pDelete;
pDelete = pNode;
}
}
return Head->next;
}
};

相关题目:
编程实现单链表的逆转函数:实现单链表的逆转函数,输入一个链表,反转链表后,返回翻转之后的链表。
找出单链表中的一个节点,该节点到尾指针的距离为K:找出单向链表中的一个节点,该节点到尾指针的距离为K。链表的倒数第0个结点为链表的尾指针。要求时间复杂度为O(n)。
每K个一组反转链表:给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。

浙公网安备 33010602011771号