7、复杂链表的复制
描述:
示例
思路:
利用map的键值对映射关系巧妙去构建新链表(学习的大佬思想)
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead) {
if(pHead == NULL) return nullptr;
RandomListNode* tem = pHead;
//map 中存放的是键值对,利用Key映射其对应的Value的对应关系来把复杂链表
//的每一个节点映射到其对应的另一个新的链表节点
//Key和Value在这里的类型都为RandomListNode*类型
unordered_map<RandomListNode*, RandomListNode*> mp;
while(tem != NULL)
{
//新建链表节点等于复制的旧节点并建立旧节点到新节点的映射关系
//此时新节点只有值域,指针域还未赋值
mp[tem] = new RandomListNode(tem->label);
tem = tem->next;
}
tem = pHead;
while(tem != NULL)
{
//将旧节点的两个指针<。)#)))≦的指向赋值给新节点
mp[tem]->next = mp[tem->next];
mp[tem]->random = mp[tem->random];
tem = tem->next;
}
//返回新建链表的头节点;
return mp[pHead];
}
};
思路清晰了你也快来试一试吧~
复杂链表的复制
8、删除链表中重复的节点
描述及示例:
思路很简单,遍历寻找就完事
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead) {
if(pHead == NULL) return NULL;
ListNode* myNode = new ListNode(0);
myNode->next = pHead;
ListNode* cur = myNode;
//第一个节点和第二个节点的指向都不为空时进入循环
while(cur->next != NULL && cur->next->next != NULL)
{
//第一个节点和第二个节点的值域相等时
if(cur->next->val == cur->next->next->val)
{
int tem = cur->next->val;
//将重复的元素覆盖一直到下一个元素和当前元素不重复时
while(cur->next != NULL && cur->next->val == tem)
cur->next = cur->next->next;
}
else
cur = cur->next;
}
return myNode->next;
}
};
思路清晰了你也快来试一试吧~
删除链表中重复节点
9、删除链表的节点
描述及示例:
思路:单链表无非就是把当前节点的前一个结点保存好并往下遍历,遇到满足条件的节点直接覆盖。
class Solution {
public:
/**
* @param head ListNode类
* @param val int整型
* @return ListNode类
*/
ListNode* deleteNode(ListNode* head, int val) {
if(head == NULL) return NULL;
ListNode* res = new ListNode(0);
res->next = head;
ListNode* pre = res;
ListNode* cur = head;
while(cur)
{
if(cur->val == val)
{
pre->next = cur->next;
}
pre = cur;
cur = cur->next;
}
return res->next;
}
};
思路清晰了你也快来试一试把~
删除链表的节点