一、1290. 二进制链表转整数
题目描述
给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。
请你返回该链表所表示数字的 十进制值 。
代码示例
/**
* Definition for singly-linked list.
* 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 {
int GetListLength(ListNode *head){
ListNode *tmp=head;
int cnt=0;
while(tmp){
++cnt;
tmp=tmp->next;
}
return cnt;
}
public:
int getDecimalValue(ListNode* head) {
ListNode* use=head;
int len=GetListLength(head);
int res=0;
while(len>0){
res+=use->val*pow(2,len-1);
use=use->next;
--len;
}
return res;
}
};
解题记录
先求得链表长度,并用二进制转换至十进制的方法,求得结果
二、237. 删除链表中的节点
题目描述
请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。
题目数据保证需要删除的节点 不是末尾节点 。
代码示例
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void deleteNode(ListNode* node) {
ListNode* tmp=node->next;
node->val=node->next->val;
node->next=node->next->next;
delete tmp;
tmp=NULL;
}
};
解题记录
这道题给我们讲了一个道理,想要杀掉一个人,就成为他,并让他被变成无关的人,然后再杀掉他
用一个指针指向需要删除node
的下一位,等下需要释放这一位
然后让需要删除的node
的val
next
都复制为下一位的值,
最后删除刚刚指针指向的内存
三、剑指 Offer II 024. 反转链表
题目描述
给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。
代码示例
/**
* Definition for singly-linked list.
* 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 *pre=nullptr,*vtx;
vtx=head;
while(vtx){
ListNode *tmp=vtx->next;
vtx->next=pre;
pre=vtx;
vtx=tmp;
}
return pre;
}
};
解题记录
相当于将链表的指针翻转即可。
四、1019. 链表中的下一个更大节点
题目描述
给定一个长度为 n 的链表 head
对于列表中的每个节点,查找下一个 更大节点 的值。也就是说,对于每个节点,找到它旁边的第一个节点的值,这个节点的值 严格大于 它的值。
返回一个整数数组 answer ,其中 answer[i] 是第 i 个节点( 从1开始 )的下一个更大的节点的值。如果第 i 个节点没有下一个更大的节点,设置 answer[i] = 0 。
代码示例
/**
* Definition for singly-linked list.
* 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 {
int FindNextLargerNode(ListNode* head){
ListNode *use=head;
int lar=use->val;
use=use->next;
while(use){
if(use->val > lar){
return use->val;
}
use=use->next;
}
return 0;
}
public:
vector<int> nextLargerNodes(ListNode* head) {
vector<int> ans;
ListNode *use=head;
while(use){
int tmp=FindNextLargerNode(use);
ans.push_back(tmp);
use=use->next;
}
return ans;
}
};
解题记录
类似于滑动窗口,
对于每一个节点,使用FindNextLargerNode(ListNode* head)
函数寻找下一个较大值
然后存储进ans数组