大家好,我是工藤学编程 🦉 | 大二在读 |
|---|---|
作业侠系列最新文章😉 | Java实现聊天程序 |
一起备战ccf-csp与蓝桥杯系列最新文章🐷 | 一起备战蓝桥杯与CCF-CSP之大模拟炉石传说 |
一起刷算法与数据结构最新文章🐷 | 一起刷算法与数据结构-链表篇2 |
之前我们已经发布了链表篇1: 一起刷算法与数据结构-链表篇1
今天这篇的内容如下:
题目1.链表排序(待解决) 题目2.展平多级双向链表(待解决) 题目3.设计链表(待解决) 题目4.对链表进行插入排序(待解决) 题目5.k个一组翻转链表(待解决) 题目6.两两交换链表中的节点 题目7.链表中的下一个更大节点 目前力扣上的关于链表的题目都刷的差不多了,除了实在不会的以及和树相关的,等着和树一起刷,接下来就是刷树啦!


题目6.两两交换链表中的节点

解题思路: 可参考:B站大佬讲解
参考代码:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
auto dummy = new ListNode(-1);
dummy->next=head;
auto per = dummy,cur = dummy->next;
while(cur && cur->next)
{
auto temp = cur->next;
per->next = temp;
cur->next = temp->next;
temp->next = cur;
per=cur;
cur=cur->next;
}
return dummy->next;
}
};题目7.链表中的下一个更大节点

解题思路:
一般具有这种旁边的第一个最大/最小问题,我们都可以用单调栈解决,一般来说都是找左边的,这样便于我们编写代码,而这题确是从右边找,但是我们只需要逆序开始从左找,再把答案反向输出,即可得到本题答案。
参考代码:
class Solution {
public:
vector<int> nextLargerNodes(ListNode* head) {
vector<int>l;
vector<int>ans;
for(auto p=head;p;p=p->next)
{
l.push_back(p->val);
}
stack<int>s;
for(int i=l.size()-1;i>=0;i--)
{
if(!s.empty() && l[i]<s.top())
{
ans.push_back(s.top());
}
else
{
while(!s.empty() && l[i]>=s.top())
{
s.pop();
}
if(!s.empty()) ans.push_back(s.top());
else ans.push_back(0);
}
s.push(l[i]);
}
//return ans;
for(int i=0;i<ans.size()/2;i++)
{
swap(ans[i],ans[ans.size()-i-1]);
}
return ans;
}
};好了,链表篇就告一段落啦,我没有解决的题解决了会更新滴,大家也可以去尝试尝试哦!