詳解華為筆試試題之雙向迴圈鍊錶題

2021-05-25 22:14:52 字數 1663 閱讀 7171

摘自:

有乙個雙向迴圈鍊錶鍊錶1和鍊錶2,將這兩個鍊錶中重複的元素刪除,並將這兩個鍊錶中相同的元素刪除。例如鍊錶1中輸入的元素是2,1,3,4,1;鍊錶2是3,1,4,5,6,;則輸出鍊錶1為2,;鍊錶2為5,6;

演算法思想:在鍊錶1中查詢重複的元素,如果有的話將重複的第二個以上的元素刪除,留乙個元素,之後將這個元素與鍊錶2的所有元素比較,如果鍊錶2中有元素與這個元素相等就將鍊錶2的這個元素刪除,無論鍊錶2有無元素與這個元素相等,都將鍊錶1中的這個元素刪除。之後再鍊錶2將自身重複的元素刪除既可。

#include

#include

struct stud

;void main()

printf("請輸入乙個數/n");

p=(struct stud *)malloc(sizeof(struct stud));

scanf("%d",&p->data);

while(p->data!=1000)

printf("請輸入乙個數/n");

q=(struct stud *)malloc(sizeof(struct stud));

scanf("%d",&q->data);

while(q->data!=1000)

printf("/n現在輸出第二個鍊錶/n");

q=head2->next;

while(q!=head2)

p=head1->next;

q=head1->next;

while(p!=head1)

else

q=q->next;

}else

q=q->next;

}q1=head2->next;

while(q1!=head2)/*鍊錶2中有與鍊錶1中相同的元素就將它刪掉*/

else

q1=q1->next;

if(count>=2||flag))/*演算法關鍵所在,若在在鍊錶1中的乙個數,在鍊錶1中出現了2次,或在鍊錶2中出現過,就將鍊錶1中這個數刪除掉*/

else

p=p->next;

}p=head2->next;

q=head2->next;

while(p!=head2)

else

q=q->next;

}else

q=q->next;

}if(count>=2)/*將鍊錶2中的重複元素刪除*/

else

p=p->next;

}printf("/n刪除兩個鍊錶中相同的元素之後的結果是,現在輸出第乙個鍊錶/n");

p=head1->next;

while(p!=head1)

printf("/n現在輸出第二個鍊錶/n");

q=head2->next;

while(q!=head2)

printf("/n現在開始釋放記憶體/n");

p=head1->next;

while(p!=head1)

printf("鍊錶1釋放完畢/n");

p=head2->next;

while(p!=head2)

printf("鍊錶2釋放完畢/n");

延伸閱讀:

《程式設計之美》豆瓣

《程式設計之美》互動網

《程式設計之美》,

it人求職面試必讀

牛客網 華為筆試題 迴圈鍊錶

有乙個陣列a n 順序存放0 n 1,要求每隔兩個數刪掉乙個數,到末尾時迴圈至開頭繼續進行,求最後乙個被刪掉的數的原始下標位置。以8個數 n 7 為例 0,1,2,3,4,5,6,7 0 1 2 刪除 3 4 5 刪除 6 7 0 刪除 如此迴圈直到最後乙個數被刪除。迴圈鍊錶 尾部節點的next指標...

雙向迴圈鍊錶的實現詳解

雙向迴圈鍊錶直接體現為雙向和迴圈,一般的單鏈表只有節點資料data和next指向位址 應該也是引用的意思 而在此需要增加前面部分的pre指向位址,同時還需要迴圈 迴圈則在定義節點時可以解決,如下所示 雙向可以假想三個節點,實際上就是3個節點之間完成pre和next的指向替換,如下圖所示 原來的下乙個...

中興通訊2012筆試題刪除雙向迴圈鍊錶中相同的數值

雙向迴圈鍊錶pheada pheadb,例如 pheada 資料為 1,2,3,4,5,7 pheadb資料為 1,2,6,2,1,7,3 刪除相同數值後為 pheada 4,5 pheadb 6 include using namespace std typedef struct doubleli...