温习链表,学有所得
做链表题目之时,一定记得画图!记得画图!记得画图!
链表元素删除
分为两种情况——如果是头节点,直接后移即可;如果是非头节点,需要用到待删除节点的前一个节点,将待删除节点的后一个节点地址待删除节点的前一个节点的next。
代码如下:
listnode* deleteval(listnode *head,int val){//删除链表中值等于val的节点
//链表中元素的删除分为两种情况——头节点和非头结点
//如果是头节点的话,直接后移
//如果是非头结点,需要用到当前节点的前一个节点
if(!head) return NULL;//首先排除空链表的情况
while(head&&(head->val==val)){//1.头节点的情况
listnode *tmp = head;//暂存待删除节点
head = head->next;//指针后移
delete tmp;//删除节点
}
listnode *tmp = head;//显然,当前的tmp的值不可能是要求的val
while(tmp&&(tmp->next)){
if(tmp->next->val==val){
listnode *del = tmp->next;
tmp->next = tmp->next->next;
delete del;
}
else tmp = tmp->next;
}
return head;
}
添加主函数进行本地测试
#include<iostream>
using namespace std;
struct listnode{//定义节点结构体
int val;//数值
listnode *next;//指针
// listnode(int r_val,listnode *r_next):val(r_val),next(NULL){}
};
listnode* deleteval(listnode *head,int val){//删除链表中值等于val的节点
//链表中元素的删除分为两种情况——头节点和非头结点
//如果是头节点的话,直接后移
//如果是非头结点,需要用到当前节点的前一个节点
if(!head) return NULL;//首先排除空链表的情况
while(head&&(head->val==val)){//1.头节点的情况
listnode *tmp = head;//暂存待删除节点
head = head->next;//指针后移
delete tmp;//删除节点
}
listnode *tmp = head;//显然,当前的tmp的值不可能是要求的val
while(tmp&&(tmp->next)){
if(tmp->next->val==val){
listnode *del = tmp->next;
tmp->next = tmp->next->next;
delete del;
}
else tmp = tmp->next;
}
return head;
}
listnode* creatlinklist(){//创建链表
int data;
listnode *head = new listnode;
listnode *r=head;
while(cin>>data){
listnode *tmp = new listnode;
tmp->val = data;
r->next = tmp;
r = tmp;
// tmp->next->val = data;
/// tmp = tmp->next;
if(getchar()=='\n') break;
}
r->next = NULL;
return head->next;
}
void showlinklist(listnode *head){
listnode *tmp = head;
while(tmp){
cout<<tmp->val<<" ";
tmp = tmp->next;
}
cout<<"\n";
}
int main(){
listnode *head = creatlinklist();
showlinklist(head);
int val;
cin>>val;
listnode *n_head = deleteval(head,val);
showlinklist(n_head);
return 0;
}
- 顺便 温习链表的两种构造方法