文章目录
一、1290. 二进制链表转整数
1.原题链接
2.题目描述
给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值 。
3.解题思路
遍历链表,将值转化为十进制即可。
4.源码
class Solution {
public:
int getDecimalValue(ListNode* head) {
int sum=0;
while(head){
sum=sum*2+head->val;
head=head->next;
}
return sum;
}
};
二、237. 删除链表中的节点
1.原题链接
2.题目描述
请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。题目数据保证需要删除的节点 不是末尾节点 。
3.解题思路
脑筋急转弯题,要删除一个链表,把要删除的节点的下一个节点的值给要删除的节点,然后删除下一个节点即可
4.源码
class Solution {
public:
void deleteNode(ListNode* node) {
node->val=node->next->val;
node->next=node->next->next;
}
};
三、剑指 Offer II 024. 反转链表
1.原题链接
2.题目描述
给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。
3.解题思路
运用头插法解题
4.源码
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head==nullptr){
return head;
}
ListNode* pre =nullptr;
ListNode* cur =head;
while(cur!=nullptr){
ListNode* temp =cur->next;
cur->next =pre;
pre=cur;
cur = temp;
}
return pre;
}
};
四、1019. 链表中的下一个更大节点
1.原题链接
2.题目描述
给定一个长度为 n 的链表 head;对于列表中的每个节点,查找下一个 更大节点 的值。也就是说,对于每个节点,找到它旁边的第一个节点的值,这个节点的值 严格大于 它的值。返回一个整数数组 answer ,其中 answer[i] 是第 i 个节点( 从1开始 )的下一个更大的节点的值。如果第 i 个节点没有下一个更大的节点,设置 answer[i] = 0 。
3.解题思路
使用栈来解题,遍历栈,将每个栈的值和栈顶元素比较,如果比它大,就找到大的值,弹出栈顶,直到找不到为止。
4.源码
class Solution {
public:
vector<int> nextLargerNodes(ListNode* head) {
vector<int> res;
stack<int> mem;
int i=0;
while(head != nullptr){
while(!mem.empty() &&head->val>res[mem.top()]){
res[mem.top()]=head->val;
mem.pop();
}
res.push_back(head->val);
mem.push(i++);
head=head->next;
}
while(!mem.empty()){
res[mem.top()]=0;
mem.pop();
}
return res;
}
};
总结
十二天,继续加油,链表还需要继续学习头插法。