【五月集训】第十一天作业——矩阵
1290. 二进制链表转整数
分析及思路:链表最后一个位置对应二进制最低位, 以此类推,从头到尾遍历链表, 读取一个值与ans(存储结果)进行或运算, 然后再移位即可。
如: int ans = 0(因为最多30个值, 故int即可), list [1, 0, 0 , 1]
读取第一个数 ans = ans | 1 = 1
读第二个数: ans = (ans<<1)| 0 =(10)2
读第三个数: ans = (ans<<1)| 0 =(100)2
读第四个数: ans = (ans<<1)| 1 =(1001)2
intgetDecimalValue(structListNode* head){
intans = 0;
structListNode *cur = head;
while(cur){
ans = ans << 1;
ans |= cur-> val;
cur = cur->next;
}
returnans;
}
237. 删除链表中的结点
分析及思路:通常删除节点, 从前往后遍历,删除即可, 但是此题没有前驱的地址, 因此需要更换思路。 链表存储数据, 删除当前链表后,只是将数据删除, 将待删除节点的后继节点的数值存储到当前节点,然后再删除后继节点即可。(如果一直盯着删除结点的话, 就走进死胡同了)
voiddeleteNode(structListNode* node) {
structListNode* aft = node->next;
node->val = aft->val;
node->next = aft->next;
aft = NULL;
}
剑指offer II 024. 链表反转
分析及思路:头插法, 从头到尾扫一遍即可
structListNode* reverseList(structListNode* head){
structListNode *first = NULL, *vtx;
while(head){
vtx = head->next;
head->next = first;
first = head;
head = vtx;
}
returnfirst;
}
1019. 链表中最大节点
分析及思路:暴力解法, 逐个遍历,每个节点都往后扫一下即可
int* nextLargerNodes(structListNode* head, int* returnSize){
// 1. get list length
structListNode* p = head;
intlength = 0;
while(p){
p = p->next;
length ++;
}
// 2. mmalloc a arry store ans
int *ans = (int *)calloc(length , sizeof(int));
intind = 0;
while(head){
p = head;
while((p) && (head->val >= p->val)){ //刚开始想错了,导致卡壳
p = p->next;
}
p && (ans[ind] = p->val);
head = head->next;
ind++;
}
*returnSize = length; // 之前一直错误, 忘记给这个变量赋值-。 -
returnans;
}