代码随想录训练营第三天 203 移除链表元素 707 设计链表 206 反转链表

203.移除链表元素

建议: 本题最关键是要理解 虚拟头结点的使用技巧,这个对链表题目很重要。

题目链接/文章讲解/视频讲解::https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1%A8%E5%85%83%E7%B4%A0.html

代码如下

/**

* Definition for singly-linked list.

* struct ListNode {

* int val;

* struct ListNode *next;

* };

*/

struct ListNode* removeElements(struct ListNode* head, int val){

struct ListNode * phead = (struct ListNode*)malloc(sizeof(struct ListNode)) ; // 创建虚拟头结点

phead->next = head ; //使虚拟头结点指向头结点

struct ListNode * cur = phead ; //定义一个遍历指针 ,遍历指针指向虚拟头结点

while(cur->next != NULL){ // 指向空节点跳出循环

if(cur->next->val == val){ // 该节点的val是否与目标值相等

struct ListNode * t = cur->next ; 创造一个临时指针指向要删除节点

cur->next = cur->next->next ; // 指向要删除节点的指针直接指向删除节点的下一个指针

free(t); 释放内存

}

else{

cur = cur->next ; 如果值不相等,指针向下移动

}

}

head = phead->next ; 将虚拟头结点的下一个节点定义为新的头结点

free(phead);

return head ;

}

//之前有思路还是多少有一点混乱,看完卡哥视频理一下思路,自己写的时候,在纸上画一下,并且把每句话都注释一下,感觉思路一下子清晰了很多。

707.设计链表

建议: 这是一道考察 链表综合操作的题目,不算容易,可以练一练 使用虚拟头结点

题目链接/文章讲解/视频讲解:https://programmercarl.com/0707.%E8%AE%BE%E8%AE%A1%E9%93%BE%E8%A1%A8.html

typedef struct l {

int val ;

struct l * next ;

} MyLinkedList,*pnode;

MyLinkedList* myLinkedListCreate() {

pnode phead = (pnode)malloc(sizeof(MyLinkedList));

if(phead == NULL){

printf("dongtaifenpeishibai");

exit(-1);

}

pnode ptail = phead ;

ptail->next = NULL ;

return phead ;

}

int myLinkedListGet(MyLinkedList* obj, int index) {

pnode phead = (pnode)malloc(sizeof(MyLinkedList));

phead->next = obj ;

pnode cur = phead ;

if(index<0){

return -1 ;

}

while(index){

cur = cur->next ;

index-- ;

}

return cur->val ;

}

void myLinkedListAddAtHead(MyLinkedList* obj, int val) {

pnode phead = (pnode)malloc(sizeof(MyLinkedList));

phead->next = obj ;

pnode pnew = (pnode)malloc(sizeof(MyLinkedList)) ;

pnew->val = val ;

pnew->next = phead->next ;

phead->next = pnew ;

}

void myLinkedListAddAtTail(MyLinkedList* obj, int val) {

pnode phead = (pnode)malloc(sizeof(MyLinkedList));

phead->next = obj ;

pnode pnew = (pnode)malloc(sizeof(MyLinkedList)) ;

pnew->val = val ;

pnode cur = phead ;

while(cur->next != NULL){

cur = cur->next ;

}

cur->next = pnew ;

pnew->next = NULL ;

}

void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {

pnode phead = (pnode)malloc(sizeof(MyLinkedList));

phead->next = obj ;

pnode cur = phead ;

while(index){

cur =cur->next ;

index-- ;

}

pnode pnew = (pnode)malloc(sizeof(MyLinkedList));

pnew->val = val ;

pnew->next = cur ;

phead->next = pnew ;

obj = phead->next ;

pnode t = phead ;

free(t);

}

void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {

pnode phead = (pnode)malloc(sizeof(MyLinkedList));

phead->next = obj ;

pnode cur = phead ;

while(index){

cur = cur->next ;

index-- ;

}

pnode t = cur->next ;

cur->next = cur->next->next ;

free(t) ;

}

void myLinkedListFree(MyLinkedList* obj) {

while(obj != NULL){

pnode tmp = obj ;

obj = obj->next ;

free(tmp);

}

}

206.反转链表

建议先看我的视频讲解,视频讲解中对 反转链表需要注意的点讲的很清晰了,看完之后大家的疑惑基本都解决了。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.html

代码

struct ListNode* reverseList(struct ListNode* head){

struct ListNode * cur = head ;

struct ListNode * pre = NULL ;

while(cur){

struct ListNode * tmp = cur->next ;

cur->next = pre ;

pre = cur ;

cur = tmp ;

}

return pre ;

}

建立链表的操作还不是很熟,以后还要在花时间练习练习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值