本章需要掌握:
- 1、单链表删除i位置元素?
- 2、看考研真题,背一下?
- 3、考研真题2019
1、删除元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
bool ListDelete(LinkList L,int i) { LinkList p= GetElem(L,i-1); if(NULL==p) { return false; } LinkList q=p->next; if(NULL==q) { return false; } p->next=q->next; free(q); return true; }
|
2、考研真题2019
【2019统考真题】设线性表L=(a1,a2,a3…an-2,an-1,an)采用带头结点的单链表保存,请设计一个空间复杂度为O(1)且时间上尽可能高效的算法,重新排列L中的各结点,得到线性表L’=(a1,an,a2,an-1,a3,an-2…)。
思路:找到链表中间结点,后链表逆置,合并两链表。
1、找出链表L的中间结点,设置p和q两个指针,指针p每走一步,q走两步,当q指向尾结点,p恰好指向中间节点。
2、然后L的后半段实现原地逆置。
3、从单链表前后两段中一次各取一个节点,按要求排序。
2.1我的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| void change_list(NODE* h){ NODE *p,*q,*r,*S; p=q=h; #1、找到中间结点,p指针移动一次,q指针移动两次 whlie(q->next!=NULL){ p = p->next; q = q->next; if (q->next!=NULL) q = q->next; } #2、链表逆置,头插法直接实现 q = p->next; p->next = NULL; while(q!=NULL){ r = q->next; q->next = p->next; p->next = q; q=r; } #3、排序 s = h->next; q = p->next; p->next = NULL; while(q!=NULL){ r = q->next; q->next = s->next; s->next = q; s = q->next; q = r; } }
|
2.2王道代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
| #include <stdio.h> #include <stdlib.h>
typedef int ElemType; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList;
void find_middle(LinkList L,LinkList &L2) { L2=(LinkList)malloc(sizeof(LNode)); LinkList pcur,ppre; ppre=pcur=L->next; while(pcur) { pcur=pcur->next; if(NULL==pcur) { break; } pcur=pcur->next; if(NULL==pcur) { break; } ppre=ppre->next; } L2->next=ppre->next; ppre->next=NULL; }
void reverse(LinkList L2) { LinkList r,s,t; r=L2->next; if(NULL==r) { return; } s=r->next; if(NULL==s) { return; } t=s->next; while(t) { s->next=r; r=s; s=t; t=t->next; } s->next=r; L2->next->next=NULL; L2->next=s; }
void merge(LinkList L,LinkList L2) { LinkList pcur,p,q; pcur=L->next; p=pcur->next; q=L2->next; while(p!=NULL&&q!=NULL) { pcur->next=q; q=q->next; pcur=pcur->next; pcur->next=p; p=p->next; pcur=pcur->next; } if(p!=NULL) { pcur->next=p; } if(q!=NULL) { pcur->next=q; } }
void list_tail_insert(LNode* &L) { L= (LinkList)malloc(sizeof(LNode)); L->next=NULL; ElemType x; scanf("%d",&x); LNode *s,*r=L; while(x!=9999) { s=(LinkList)malloc(sizeof(LNode)); s->data=x; r->next=s; r=s; scanf("%d",&x); } r->next=NULL; }
void print_list(LinkList L) { L=L->next; while(L!=NULL) { printf("%3d",L->data); L=L->next; } printf("\n"); }
int main() { LinkList L; list_tail_insert(L); print_list(L); LinkList L2=NULL; find_middle(L,L2); printf("--------------------------------\n"); print_list(L); print_list(L2); printf("--------------------------------\n"); reverse(L2); print_list(L2); printf("--------------------------------\n"); merge(L, L2); free(L2); print_list(L); return 0; }
|