链表

//单循环链表相关操作#include#include#include struct ListNode{int data;ListNode *next;};//链表创建:头插法实现ListNode *CreatLinklistHead(int n){ListNode *head, *p;int i;head = (ListNode *)malloc(sizeof(ListNode));head->next = NULL;for(i=0;idata = 2;//else// p->data=1;p->data = i+9;p->next = head->next;head->next = p;}return head;}//链表创建:尾插法实现ListNode *CreatLinklistTail(int n){ListNode *head, *p,*pre;int i;head = (ListNode *)malloc(sizeof(ListNode));pre=head;for(i=0;idata = i;p->next = NULL;pre->next = p;pre=p;}return head;}//print out the listvoid PrintLinklist(ListNode *list){if(list==NULL)return ; ListNode *temp=list;//temp=temp->next;printf("输出链表内容\n");while(temp!=NULL){printf("%d ",temp->data);temp = temp->next;}printf("\n");}//单链表的插入void Insertlinklist(ListNode *list, int x, int i){ListNode *p ,*s;p = list;int j=1;while(p->next&&j next;++j;}if(p==NULL){printf("Position Error");}s=(ListNode *)malloc(sizeof(ListNode *));s->data = x;s->next = p->next;p->next = s;}//delete the jiedian of listvoid deletelist(ListNode *list,int i){ListNode*p,*s;p=list;int j= 1;while(p->next&&jnext;++j;}if(p==NULL&&p->next==NULL||j>i){printf("position error");}s=p->next;p->next = s->next;//free(s);}ListNode *findkthtotail(ListNode *list,int k){/*if(list==NULL || k=0)return NULL;*/ListNode *pfirst = list;ListNode *plast = NULL;for(int i=1;inext!=NULL)pfirst = pfirst->next;elsereturn NULL;}plast = list;while(pfirst->next!=NULL){pfirst=pfirst->next;plast=plast->next;}return plast;}//list 反转ListNode * reverselist(ListNode *list){ListNode *phead = NULL;//houmianListNode *pnode = list;//dangqianListNode *ppre = NULL;//previouswhile(pnode!=NULL){ListNode *pnext = pnode->next;//储存当前结点的写一个指向的结点if(pnext==NULL)phead = pnode;pnode->next = ppre;// 当前结点下一个指向前面的结点ppre = pnode;pnode = pnext;}return phead;}//从尾到头输出单链表用栈来实现void printlistreverse(ListNode *list){std::stacknodes;ListNode *pnode = list;pnode=pnode->next;while(pnode!=NULL){nodes.push(pnode);pnode = pnode->next;}while(!nodes.empty()){pnode=nodes.top();printf("%d ",pnode->data);nodes.pop();}}//从尾到头输出单链表 递归void printlistrevers_recursively(ListNode *list){ListNode *phead = list;if(phead->next!=NULL){//if(phead->next!=NULL)//{printlistrevers_recursively(phead->next);//}printf("%d ",phead->data);}}//find the meddel jiedianListNode * findMiddleNodeOfLinedList(ListNode *head){ //判断空链表、单节点链表 if(NULL == head || NULL == head->next) { return head; } ListNode *p1 =head;ListNode*p2 = head; while(NULL != p2->next && NULL != p2->next->next ) { p2 = p2->next->next; p1 = p1->next; } return p1;}//单链表排序 归并法//void guibing_sort(ListNode *list)//{// ListNode *p1 = list->next;// ListNode *p2 = list->next;// while(p1!=NULL)// {// for(;p1->next!=NULL;p1=p1->next)// {// for(;)// }// }//}//在O(1)时间删除链表节点void deletenode(ListNode *list,ListNode *pdelete){if(!list||!pdelete)return;//要删除的结点不是尾结点if(pdelete->next!=NULL){ListNode *temp = pdelete->next;pdelete->data = temp->data;pdelete->next = temp->next;delete temp;temp = NULL;}//链表中只有一个结点,删除头结点(也是尾结点)else if(list==pdelete){delete pdelete;pdelete = NULL;list = NULL;}//链表中有多个结点,删除尾结点(按顺序查找)else{ListNode *temp=list;while(temp->next!=pdelete){temp = temp->next;}temp->next = NULL;delete pdelete;pdelete = NULL;}}//实现单链表中任意交换两个元素//返回前驱结点ListNode *findpre(ListNode *list,ListNode *p){ListNode *temp = list;while(temp){if(temp->next==p)return temp;elsetemp=temp->next;}}//交换结点ListNode *swap(ListNode *list,ListNode *p,ListNode *q){if((list == NULL)||(p==NULL)||(q==NULL)){printf("invaild paramenter: NULL");return list;}if(p->data==q->data)return list;if(p->next == q){ListNode *temp = findpre(list,p);temp->next = q;p->next = q->next;q->next = p;}else if(q->next == p){ListNode *temp = findpre(list,q);temp->next = q;q->next = p->next;p->next = q;}else if(p!=q){ListNode *pre_q = findpre(list,q);ListNode *pre_p = findpre(list,p);ListNode *next_p = p->next;p->next = q->next;q->next = next_p;pre_p->next = q;pre_q->next = p;}return list;}//删除链表重复的结点ListNode *deletesame(ListNode *list){ListNode *p,*temp=list;if(list->next == NULL)return list;list->next=deletesame(list->next);p=list->next;while(p!=NULL){if(list->data == p->data){temp->next = p->next;free(p);p=temp->next;}else{p=p->next;temp=temp->next;}}return list;}//合并两个有序的链表(非交叉)——递归方法ListNode *mergelist(ListNode *list,ListNode *list1){if(list==NULL)return list1;if(list1==NULL)return list;ListNode *head = NULL;if(list->datadata){head = list;head->next = mergelist(list->next,list1);}else{head = list1;head->next=mergelist(list1->next,list);}return head;}//合并两个链表——非递归ListNode *mergelistnon(ListNode *head,ListNode *list1,ListNode *list2){ListNode *temp=head;while(list1!=NULL&&list2!=NULL){if(list1->datadata){temp->next = list1;temp=list1;list1=list1->next;}else{temp->next = list2;temp = list2;list2=list2->next;}}if(list1!=NULL)temp->next=list1;if(list2!=NULL)temp->next=list2;return temp;}int main(){int num = 4;ListNode* list1 = CreatLinklistTail(num);ListNode* list2 = CreatLinklistHead(num);printf("the orignal list1 is: ");PrintLinklist(list1);printf("the orignal list2 is: ");PrintLinklist(list2);//printf("after insert the new element: ");//Insertlinklist(list, 66, 2);//PrintLinklist(list);//printf("after delete the element: ");//deletelist(list,6);//PrintLinklist(list);//ListNode *m=findkthtotail(list,0);//printf("%d\n",*m);/*system("pause");*///printf("after reverse the element: ");//ListNode *m = reverselist(list);//PrintLinklist(m);//printlistrevers_recursively(list);//ListNode *m = findMiddleNodeOfLinedList(list);//deletenode(list,NULL);//ListNode *p=list->next;//ListNode *q=p->next->next;//list1=swap(list,p,q);//deletesame(list);//PrintLinklist(list);/*ListNode *n=mergelist(list,list1);PrintLinklist(n);*/ListNode *head = (ListNode *)malloc(sizeof(ListNode));ListNode *n=mergelistnon(head,list1,list2);PrintLinklist(n);return 0;}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值