单链表建立删除和就地逆置

来源:互联网 发布:车辆保险的算法 编辑:程序博客网 时间:2024/05/22 14:53
#include <iostream>using namespace std;typedef struct linklist{linklist *link;int val;}*listPoint;//链表插入思想来自C与指针,链表处理不带头结点。void insertType2(linklist **linkp,int new_val){listPoint current;listPoint new_linklist_point;while ((current=*linkp)!=NULL&¤t->val<new_val){linkp=¤t->link;}new_linklist_point=new linklist;if (new_linklist_point==NULL){cout<<" memory new errors \n";}new_linklist_point->val=new_val;new_linklist_point->link=current;*linkp=new_linklist_point;}//这种操作直观好理解,但是需要单独考虑特殊情况void insertType1(linklist **head,int new_val){listPoint current,previous,new_linklist;current=*head;previous=NULL;while (current!=NULL&¤t->val<new_val){previous=current;current=current->link;}new_linklist=new linklist;if (new_linklist==NULL){cout<<"memorty errors\n";}new_linklist->val=new_val;new_linklist->link=current;if (previous==NULL)//如果为第一个插入链表节点{*head=new_linklist;}elseprevious->link=new_linklist;}//输出链表没有头结点情况void PrintLinklistWithOutfirstNode(listPoint head){if (head==NULL){cout<<"empty linklist \n";}while (head){cout<<head->val<<" ";head=head->link;}cout<<endl;}//输出链表有头结点情况void PrintLinklistWithfirstNode(listPoint head){if (head->link==NULL){cout<<"empty linklist \n";}while (head->link){cout<<head->link->val<<" ";head=head->link;}cout<<endl;}//链表反转需要头结点。linklist *reverseLinklist(listPoint head){linklist *p,*q;//判断链表至少有两个元素if (head->link->link&&head->link){p=head->link;q=p->link;p->link=NULL;while (q){p=q;q=q->link;p->link=head->link;head->link=p;}}return head;}//这个是没有头结点链表反转linklist *reverseLinklistWithoutNode(listPoint current){listPoint pre,next;for (pre=NULL;current!=NULL;current=next){next=current->link;current->link=pre;pre=current;}return pre;}void delete_linklistNode(listPoint &head,int delete_num){listPoint pre,current,next;for (pre=NULL,current=head;current!=NULL;current=next){next=current->link;if (current->val==delete_num){if (pre==NULL){head=head->link;}else{pre->link=current->link;}break;}pre=current;}}int main(){int a[]={1,2,7,8,3,4};listPoint head=NULL;for (int i=0;i<6;i++){insertType1(&head,a[i]);}listPoint root=new linklist;root->link=head;PrintLinklistWithOutfirstNode(head);delete_linklistNode(head,8);PrintLinklistWithOutfirstNode(head);PrintLinklistWithOutfirstNode(reverseLinklistWithoutNode(head));//PrintLinklistWithfirstNode(reverseLinklist(root));}
单链表两种情况一种是带头结点的,一种不带头结点,这里实现的是不带头结点。
1 0
原创粉丝点击