四、双向链表复制
四、雙向鏈表復制
文章目錄
- 四、雙向鏈表復制
- 題目描述
- 解題思路
- 上機代碼
題目描述
設一帶頭結點的雙向循環鏈表表示的線性表:L =(a1, a2, …… , an)
請寫出一個時間復雜度為O(n)的算法,將L改造為:L =(a1, a2, ……, an-1, an, an-1, ……, a2, a1)
預設代碼:
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW *//* 設一帶頭結點的雙向循環鏈表表示的線性表: L =(a1, a2, …… , an) 請寫出一個時間復雜度為O(n)的算法,將L改造為: L =(a1, a2, ……, an-1, an, an-1, ……, a2, a1) */#include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct DuLNode {ElemType data; // 數據域struct DuLNode *prior; // 指向前驅的指針域struct DuLNode *next; // 指向后繼的指針域 } DuLNode, * DuLinkList;// 函數原型 void out_next(DuLinkList); void out_prior(DuLinkList); void rcopy(DuLinkList); //這是你要編寫的函數 // 函數定義 void out_next(DuLinkList DHead) { DuLinkList p = DHead->next; while ( p != DHead ){ printf("%d,", p->data);p = p->next;}printf("\n"); } void out_prior(DuLinkList DHead) { DuLinkList p = DHead->prior; while ( p != DHead ){ printf("%d,", p->data);p = p->prior;}printf("\n"); }int main() { DuLinkList DHead, p;int num;DHead = (DuLNode*)malloc( sizeof(DuLNode));DHead->data = -1;DHead->prior = DHead->next = DHead; // 生成表頭scanf("%d", &num);while ( num != -1 ){ p = (DuLNode*)malloc( sizeof(DuLNode));p->data = num;p->next = DHead->next; // 1.鏈接p的next鏈 DHead->next = p; // 2.鏈接DHead的next鏈p->next->prior = p; // 3.鏈接p的next的prior鏈p->prior = DHead; // 4.鏈接p的prior鏈scanf("%d", &num);}printf("Link next:"); out_next( DHead );printf("Link prior:"); out_prior( DHead );rcopy( DHead );printf("NewL next:"); out_next( DHead );printf("NewL prior:"); out_prior( DHead );return 0; } /************************************** void rcopy(DuLinkList DHead) {This function is wating for you. } ***************************************//* PRESET CODE END - NEVER TOUCH CODE ABOVE */| 測試用例 1 | 1 2 3 4 5 -1 | Link next:5,4,3,2,1, Link prior:1,2,3,4,5, NewL next:5,4,3,2,1,2,3,4,5, NewL prior:5,4,3,2,1,2,3,4,5, | 1秒 | 64M | 0 |
| 測試用例 2 | 10 20 -1 | Link next:20,10, Link prior:10,20, NewL next:20,10,20, NewL prior:20,10,20, | 1秒 | 64M | 0 |
| 測試用例 3 | 1 2 3 4 5 6 7 8 9 10 11 12 -1 | Link next:12,11,10,9,8,7,6,5,4,3,2,1, Link prior:1,2,3,4,5,6,7,8,9,10,11,12, NewL next:12,11,10,9,8,7,6,5,4,3,2,1,2,3,4,5,6,7,8,9,10,11,12, NewL prior:12,11,10,9,8,7,6,5,4,3,2,1,2,3,4,5,6,7,8,9,10,11,12, | 1秒 | 64M | 0 |
解題思路
函數參數傳入的是頭結點Dhead的位置,Dhead->prior 即找到an結點。使用兩個指針p、q,其中p指向an結點。
p指針向左掃描一個位置,就利用q指針向右建立一個結點,仿照main函數中的操作建立雙向循環鏈表即可。
上機代碼
void rcopy(DuLinkList DHead) {//找到an結點DuLinkList p = DHead->prior, q=NULL;//建立雙向循環鏈表while(p->prior != DHead){p = p->prior;q = (DuLNode*)malloc(sizeof(DuLNode));q->data = p->data;q->prior = DHead->prior;q->prior->next = q;q->next = DHead;q->next->prior = q;} }總結
- 上一篇: 三、单词压缩存储
- 下一篇: Win10安装Maven并更换阿里源