尾插法(无头结点头指针head里直接就有内容的)创建链表
#include<iostream> #include<iomanip> #include<cmath> #include<cstring> #include<malloc.h> using namespace std; struct ListNode{ int number; struct ListNode *next; }; ListNode* CreateList(ListNode* head){ ListNode *p,*q; int SIZE,i=0; head=NULL; q=head; cin>>SIZE;//输入链表元素的个数 while(i<SIZE){ p=(ListNode*)malloc(sizeof(ListNode)); cin>>p->number; if(head==NULL){ //空的一团 漂浮着 无实体 所以出现第一个新元素的时候直接等过去就行 head=p; 之后再是next head=p; q=p; } else{ q->next=p; q=p; } i++; } q->next=NULL; return head; /*整个链表输入过程不用换行*/ } void ShowList(ListNode *head){ while(head!=NULL){ cout<<head->number<<" "; head=head->next; } cout<<endl; } int main(){ ListNode *head1,*head2; head1=CreateList(head1); head2=CreateList(head2); //链首指针要在主函数里 ShowList(head1); ShowList(head2); return 0; }
真他妈难以置信我这一个学期过了弄绷链表连接了 之前写的代码全他妈不对
链表的合并 (相同元素只保留一个):ListNode *Merge(ListNode* head1,ListNode* head2){
ListNode *p1=head1,*p2=head2; ListNode *temp; ListNode *head3, *c; head3=(ListNode*)malloc(sizeof(ListNode));//此时申请了一个指针空间 所以head不再是漂浮着了 里面有number还有指针 所以自然接下来c的操作就是next c=head3;/////////////////// while(p1!=NULL&&p2!=NULL){ if(p1->number<p2->number){ temp=p1; /*借助了中间指针*/ c->next=temp; p1=p1->next; c=c->next; } else if(p1->number>p2->number){ temp=p2; c->next=temp; p2=p2->next; c=c->next; } else{ temp=p1;//借助中间变量 c->next=temp; p1=p1->next; p2=p2->next;//两者相同的话只出现一次 另一个也next c=c->next; } if(p1){ c->next=p1; } else{ c->next=p2; } } return head3->next;/*
为什么要返回head->next 就是因为根本head的number具体内容没有用也不保证是什么(我们当然没有输入它) 输出时指不定输出什么 92739236 1 2 3 4(后四个是合并)
那么往其他函数传递的时候传的这个链表 是没有这个头结点的 就是传了一个一上来就是内容的链表 head就是贼普通的一个节点
*/
删除链表相同元素只保留一个:
NODE *delSame_2(NODE *head) { NODE *p,*q,*r; p = head->next; // 适用于有头节点的单链表;对于不带头节点的单链表,此处改为 p=head 即可。 while(p != NULL) // p用于遍历链表 { q = p; while(q->next != NULL) // q遍历p后面的结点,并与p数值比较 { if(q->next->data == p->data) { r = q->next; // r保存需要删掉的结点 q->next = r->next; // 需要删掉的结点的前后结点相接 free(r); } else q = q->next; } p = p->next; } return head; }