链表part01
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、移除链表元素
力扣题目:203. 移除链表元素
思路一:直接操作链表
1.步骤
- 遍历判断头结点是否为空,以及头结点的值是否等于目标值
2.代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val) {
while (head&&head->val==val){
head=head->next;
}
struct ListNode* curr=head;
struct ListNode* next=NULL;
while(curr&&(next=curr->next)){
if(next->val==val){
curr->next=next->next;
free(next);
}else{
curr=curr->next;
}
}
return head;
}
二、设计链表
力扣题目:707. 设计链表
1.代码实现
typedef struct MyLinkedList{
int val;
struct MyLinkedList* next;
} MyLinkedList;
MyLinkedList* myLinkedListCreate() {
MyLinkedList* head=(MyLinkedList*) malloc(sizeof(MyLinkedList));
head->next=NULL;
return head;
}
int myLinkedListGet(MyLinkedList* obj, int index) {
MyLinkedList* curr=obj->next;
int i=0;
while(curr!=NULL){
if(i==index){
return curr->val;
}else
curr=curr->next;
i++;
}
return -1;
}
void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
MyLinkedList* new_node=malloc(sizeof(MyLinkedList));
new_node->val=val;
new_node->next=obj->next;
obj->next=new_node;
}
void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
MyLinkedList* curr=obj;
while(curr->next!=NULL){
curr=curr->next;
}
MyLinkedList* new_node=malloc(sizeof(MyLinkedList));
new_node->val=val;
new_node->next=NULL;
curr->next=new_node;
}
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
if(index==0){
myLinkedListAddAtHead(obj,val);
return;
}
MyLinkedList* curr=obj->next;
int i=1;
while(curr){
if(index==i){
MyLinkedList* new_node=malloc(sizeof(MyLinkedList));
if(!new_node){
exit(1);
}
new_node->val=val;
new_node->next=curr->next;
curr->next=new_node;
return;
}else{
curr=curr->next;
}
i++;
}
}
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
if(index==0){
MyLinkedList* tmp=obj->next;
if(tmp!=NULL){
obj->next=tmp->next;
free(tmp);
}
return;
}
int i=1;
MyLinkedList* curr=obj->next;
while(curr&&curr->next){
if(i==index){
MyLinkedList* temp=curr->next;
if(temp!=NULL){
curr->next=temp->next;
free(temp);
}
return;
}
else{
curr=curr->next;
}
}
}
void myLinkedListFree(MyLinkedList* obj) {
while(obj!=NULL){
MyLinkedList* tmp=obj;
obj=obj->next;
free(tmp);
}
}
我的代码不能通过全部示例应该是用了while没用for吧?
正确的代码代码随想录
三、反转链表
1.步骤
1.创建两个指针一个保存前置结点pre一个为临时结点temp
2.通过循环逐一保存头结点的下一个结点信息;将头结点的next"连接"至前置节点。将前置结点与头结点交换并更新头结点为下一个结点的。
3.当头结点为空时结束循环并返回pre。
2.代码实现
typedef struct ListNode_s {
int val;
struct ListNode_s *next;
}ListNode;
ListNode* reverseList(ListNode* head) {
ListNode* temp;
ListNode* pre=NULL;
while(head){
temp=head->next;
head->next=pre;
pre=head;
head=temp;
}
return pre;
}
总结
前段时间没有时间完成算法题,慢慢追赶进度。
再学习进阶的如创建虚拟头结点删除元素以及如何递归的反转链表