题目1:移除重复节点
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
解题思路:
1.创建一个set表,将第一次出现的节点值保存起来
2.定义pre指针保存前驱,定义cur指针遍历链表
2.遍历链表,如果当前节点是第一次出现,那么就放入set表中,pre的后继指向当前节点,pre和cur都往后走
如果当前节点不是第一次出现,那么pre不动,cur往后走
源代码如下:
class Solution {
public:
ListNode* removeDuplicateNodes(ListNode* head) {
if(head==NULL) return head;
unordered_set<int> visited(head->val);//定义一个set容器,保存第一次出现的节点值
ListNode* pre=head;
ListNode* cur=head->next;
while(cur)
{
if(set.count(cur->val)==0)//判断是否存在该节点
{
set.insert(cur->val);//插入元素
pre->next=cur;
pre=pre->next;
}
cur=cur->next;
}
//遍历完后,cur此时应该指向nullptr
pre->next=cur;//pre指针指向cur,结束链表
return head;
}
};
题目2:删除中间节点
若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。
假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。
例如,传入节点 c
(位于单向链表 a->b->c->d->e->f
中),将其删除后,剩余链表为 a->b->d->e->f
输入:节点 5 (位于单向链表 4->5->1->9 中) 输出:不返回任何数据,从链表中删除传入的节点 5,使链表变为 4->1->9
解题思路:
难点在于只知道中间节点的后继,但不知道它的前驱节点 ,无法直接通过前驱指向后继实现本题。
所以我们可以将中间节点的后继节点值赋给中间节点,那么此时链表变为了4->1->1->9 ,然后将中间节点的后继节点删除即可。
源代码如下:
lass Solution {
public:
void deleteNode(ListNode* node) {
node->val=node->next->val;//把中间节点的后继节点的值赋给中间节点
node->next=node->next->next;//再将中间节点的后继节点删除即可
}
};