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 ;
}
建立链表的操作还不是很熟,以后还要在花时间练习练习。