今天面试时写的,应该注意时间,现在的代码不能支持删除第一个结点的,和在第一个结点之前插入,后面有空了的话要把加入头结点的方式的补上,让代码更完善。
需要特别注意的是:while循环里的条件,必须有p!=NULL p为空的时候不能再有next指针域了就会出错,以及不要忘记i++
#include <iostream>
using namespace std;
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
struct ListNode{
int val;
ListNode* next; //ListNode(int x): val(x), next(NULL) {}
};
//插入 删除 1->2->3->NULL 增删改查?
//查找,应该对应书中的函数GetElem
/*ListNode* select(ListNode* head,int m){//当第i个元素存在时,
ListNode* p=head;
while(p!=NULL){
if(p->val==x){
break;
}
p=p->next;
}
return p;
}*/
int GetElem(ListNode* head,int m){//获取第m个位置的元素
int i=0;//i是counter
ListNode* p=head;
while(p!=NULL && i<m-1){
p=p->next;
++i;
}
return p->val;
}
void modify(ListNode* head,int m,int x){
ListNode* p=head;
int i=0;
while(p!=NULL && i<m-1){
p=p->next;
++i;
}
p->val=x;
return;
}
void ListInsert(ListNode* head,int m,int x){//x值插在m的位置 (书上面是在第i个位置之前插入元素e)没有设头结点的话应该怎么办;
ListNode* temp=new ListNode();//这里的做法没有支持在第一个位置插入
temp->val=x;
temp->next=NULL;
ListNode* p=head;
int i=0;
while(p!=NULL && i<m-2){
p=p->next;
++i;
}
temp->next=p->next;
p->next=temp;
return;
}
void ListDelete(ListNode* head,int m){
//这种做法没有支持删除第一个结点
ListNode* p=head;
int i=0;
while(p!=NULL && i<m-2){
p=p->next;
++i;
}
ListNode* temp=p->next;
p->next=p->next->next;
delete temp;
return;
}
void print(ListNode* head){
if(head==NULL){
return;
}
ListNode* p=head;
while(p!=NULL){
cout<<p->val<<" ";
p=p->next;
}
cout<<endl;
return;
}
int main()
{
ListNode* a=new ListNode();
a->val=1;
a->next=NULL;
ListNode* b=new ListNode();
b->val=2;
b->next=NULL;
ListNode* c=new ListNode();
c->val=3;
c->next=NULL;
a->next=b;
b->next=c;
print(a);
//cout<<GetElem(a,3)<<endl;
ListInsert(a,3,4);
print(a);
//modify(a,3,9);
//print(a);
ListDelete(a,3);
print(a);
cout << "Hello world!" << endl;
return 0;
}