c++ 链表操作:添加、遍历、删除、查找

来源:互联网 发布:什么是node服务器 编辑:程序博客网 时间:2024/06/05 20:25

       链表是一种动态数据结构,因为在创建链表的时候,无需知道链表的长度。链表的每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

struct node{int value;node* next;};

当插入一个结点的时候,我们只需要为新结点分配内存,然后调节结点的指针指向,新结点就被(逻辑上)链接到链表里。

/* 链表尾加入新元素*/node* addNode(node*head ,int addValue){ node* newNode=new node(); newNode->next=NULL; newNode->value=addValue; node* p=new node(); p=head; //list的头结点 if(head==NULL) {   head=newNode; //新节点为链表头节点 }else {while(p->next!=NULL)//找到尾节点p=p->next;p->next=newNode; //在尾节点后面加入新节点 } return head;}



由于链表中的内存不是一次性连续分配的,因此我们无法保证链表的内存和数组一样是连续的。因此想在链表中找到它的某一个结点,我们只能从头结点开始,沿着指向下一个结点的指针遍历链表,它的时间效率为O(n)。

/*在链表中找到某个值,删除它*/node* removeNode(node* head,int value){node* pNode=head;node* deleteNode=NULL;if(head==NULL){   cout<<"链表为空"<<endl;   return NULL;}else if(head->value==value)//头节点为目标节点{deleteNode=head;head=head->next;}else{   while(pNode->next!=NULL&&pNode->next->value!=value)//找出目标节点的上一个节点 pNode=pNode->next;   if(pNode->next!=NULL&&pNode->next->value==value)   {   deleteNode=pNode->next;   pNode->next=pNode->next->next;//删除目标节点   }} if(deleteNode!=NULL)   {   delete deleteNode;   deleteNode=NULL;   }return head;}

从头到尾遍历链表

/*从头到尾遍历链表*/void travelList(node*head){node* pNode=head;if(head==NULL)return ;else{  cout<<pNode->value<<'\t';  while(pNode->next!=NULL)  {  pNode=pNode->next;           cout<<pNode->value<<'\t';  }}  }

从尾到头打印每个结点,我们从头到尾遍历链表,并把每个节点放在stack结构中,利用stack结构先进后出”的特点,从尾到头打印结点。时间复杂度为O(n).

/*从尾到头遍历链表*/void printNodeReserve(node* head){stack<node*> nodeStack;node * pNode=head;if(head==NULL)return ;//遍历链表,并把节点保留在stack里while(pNode!=NULL){nodeStack.push(pNode);pNode=pNode->next;}while(!nodeStack.empty()){       pNode=nodeStack.top(); //返回top节点   cout<<pNode->value<<endl;   nodeStack.pop();//删除top节点}}


输出链表中倒数第K个结点。

为了实现一次遍历链表就能找到倒数第K个节点,我们定义两个指针p1,p2。第一个指针p1从链表头指针开始往前走k步,此时,第二个指针p2不动。从第k+1步开始,指针p2也开始头链表头开始遍历,两个指针距离是k.当p1遍历完链表,指向一个null值的时候,p2指针正好是倒数第k个结点。

比如查找倒数第2个指针


//查找链表中倒数第k个节点,并输出void printKthTOTotal(node *head, int k){//如果链表为空,或k为0,return if(head==NULL||k<=0) return;node* pNode1=head;node* pNode2=head;//p1指针先往前走k步while(k>0&&pNode1!=NULL){pNode1=pNode1->next;k--;}//当链表长度小于k,returnif(k>0)return; while(pNode1!=NULL){pNode1=pNode1->next;pNode2=pNode2->next;}cout<<pNode2->value<<endl;}



/
                                             
1 0
原创粉丝点击