链表使用基础——如何创建链表
前言
leetcode 题2 两数相加
已知两个非空链表,表示两个非负整数,每位数字都是按照逆序方式存储,每个节点存储一位数字
将这两个数相加,并以相同形式返回一个表示和的链表
假设:除了数字0以外,这两个数不会以0开头
示例:
建立结果链表
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int add = 0;
struct ListNode* result = NULL; //结果链表头指针head
struct ListNode* now = NULL; //当前节点指针tail
while(1){
int a,b,tmp;
struct ListNode* v = NULL; //临时节点
if(l1 != NULL)
a = l1->val;
else
a = 0;
if(l2 != NULL)
b = l2->val;
else
b = 0;
tmp = a + b + add;
if(tmp>=10){
add = tmp/10;
tmp = tmp%10;
}else{
add = 0;
}
if(result == NULL){
//判断头指针是否为空
//为空,则先创建头节点
result = (struct ListNode*)malloc(sizeof(struct ListNode));
result->val = tmp;
result->next = NULL;
now = result;
}else{
//非 头节点
v = (struct ListNode*)malloc(sizeof(struct ListNode));
v->val = tmp;
v->next = NULL;
if(now!=NULL){
//这里折磨了我一阵子,不加这个now是否为空的判断就会报错,迷惑
now->next = v;
now = now->next;
}
}
if(l1 != NULL)
l1 = l1->next;
if(l2 != NULL)
l2 = l2->next;
if(l1 == NULL && l2 == NULL){
//题目最大的陷阱所在!!!
//在所有位都一一相加后,有可能还会再进一位
//实例:9999999+9999(题目示例三,真好心)
if(add != 0){
v = (struct ListNode*)malloc(sizeof(struct ListNode));
v->val = add;
v->next = NULL;
if(now!=NULL){
now->next = v;
now = now->next;
}
}
break;
}
}
return result;
}
总结——如何创建链表(5步)
int main(){
//1.声明头指针和尾指针
struct ListNode* head = NULL;
struct ListNode* tail = NULL;
...
//2.增加节点
//进行判断:头指针是否为空
if(!head){
//3.创建头节点
head = tail = (struct ListNode*)malloc(sizeof(ListNode));
//编辑头节点head->val...
}else{
//4.创建新节点
tail->next = (struct ListNode*)malloc(sizeof(ListNode));
//编辑新节点tail->next->val
//5.更新尾指针
tail = tail->next
}
}
题源leetcode题库第二题
本人菜鸡一只,有任何问题欢迎指正,卑微鞠躬