19、删除排序链表中的重复元素
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入:head = [1,1,2] 输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3] 输出:[1,2,3]
提示:
-
链表中节点数目在范围 [0, 300] 内
-
-100 <= Node.val <= 100
-
题目数据保证链表已经按升序 排列
1、思路
遍历链表,遇到相同的删除
2、具体实现
#include<iostream>
#include<cstdio>
using namespace std;
//定义链表节点
typedef struct LNode
{
int val;
LNode* next;
LNode(int val) :val(val), next(nullptr) {};
}*LinkList, LNode;
//创建链表
LinkList ListTailInsert(int n)
{
LNode* dummyHead = new LNode(-1), * r = dummyHead, * s;
int val;
while (n-- && cin >> val)
{
s = new LNode(val);
r->next = s;
r = s;
}
return dummyHead;
}
//对链表数据域相同的节点进行去重操作
void DelDupNode(LinkList& L)
{
LNode* cur = L, * tmp;
int val = cur->val;
while (cur->next)
{
if (val == cur->next->val)
{
tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}
else
{
cur = cur->next;
val = cur->val;
}
}
}
int main()
{
LinkList L = ListTailInsert(3);
DelDupNode(L);
LNode* cur = L->next;
cout << "去重后链表:";
while (cur)
{
cout << cur->val << " ";
cur = cur->next;
}
return 0;
}
20、[反转链表]
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
提示:
-
链表中节点的数目范围是 [0, 5000]
-
-5000 <= Node.val <= 5000
1、思路
2、具体实现
#include<iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode* next) : val(x), next(next) {}
};
class Solution
{
public:
ListNode * reverseList(ListNode * head) {
ListNode* tmp;
ListNode* cur = head;
ListNode* pre = nullptr;
while (cur) {
tmp = cur->next; //暂存cur的下一个节点
cur->next = pre; //翻转相邻的两个节点
//更新pre和cur指针
pre = cur;
cur = tmp;
}
return pre; //返回反转后的头节点
}
};