@ 代码随想录算法训练营第一周(C语言)|Day3(链表)
题意:删除链表中等于给定值 val 的所有节点。
struct ListNode* removeElements(struct ListNode* head, int val) {
//struct ListNode* head1=head;
struct ListNode*dummy=NULL;
dummy=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode*shead=dummy;
dummy->next=head;
while(dummy->next){
if(dummy->next->val==val){
dummy->next=dummy->next->next;
}else{
dummy=dummy->next;
}
}
head=shead->next;
return head;
}
无。
在链表类中实现这些功能:
get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
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 * cur=obj;
for(int i=0;cur!=NULL;i++){
if(i==index){
return cur->val;
}
cur=cur->next;
}
return -1;
}
void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
MyLinkedList*cur=(MyLinkedList*)malloc(sizeof(MyLinkedList));
cur->val=val;
cur->next=obj->next;
obj->next=cur;
}
void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
MyLinkedList*cur=(MyLinkedList*)malloc(sizeof(MyLinkedList));
cur->val=val;
MyLinkedList * obj1=obj;
while(obj1->next){
obj1=obj->next;
}
obj1->next=cur;
cur->next=NULL;
}
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
MyLinkedList*cur=(MyLinkedList*)malloc(sizeof(MyLinkedList));
cur->val=val;
if(index==0){
myLinkedListAddAtHead(obj,val);
return;
}
MyLinkedList * obj1=obj;
for(int i=1;obj1!=NULL;i++){
if(i==index){
cur->next=obj1->next;
obj1->next=cur;
return;
}
obj1=obj1->next;
}
}
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
if (index == 0){
MyLinkedList *tmp = obj->next;
if (tmp != NULL){
obj->next = tmp->next;
free(tmp);
}
return;
}
MyLinkedList *cur = obj->next;
for (int i = 1 ;cur != NULL && cur->next != NULL; i++){
if (i == index){
MyLinkedList *tmp = cur->next;
if (tmp != NULL) {
cur->next = tmp->next;
free(tmp);
}
return;
}
else{
cur = cur->next;
}
}
}
void myLinkedListFree(MyLinkedList* obj) {
while(obj!=NULL){
MyLinkedList*cur=obj;
obj=obj->next;
free(cur);
}
}
还是有很多要注意的地方。
反转一个单链表。
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode*pre1;
struct ListNode*pre=NULL;
while(head){
pre1=head->next;
head->next=pre;
pre=head;
head=pre1;
}
return pre;
}
虚拟头节点pre。