标签:ret 要求 rev 单向链表 bool 倒数 amp 剑指offer dup
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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 的整数倍,那么将最后剩余节点保持原有顺序。
标签:ret 要求 rev 单向链表 bool 倒数 amp 剑指offer dup
原文地址:https://www.cnblogs.com/xiexinbei0318/p/11419901.html