一方向の循環リンクリストをマージする
トピック
空でないリンクリスト(a1、a2、a3、a4、a5、...、an)は、ストレージ構造としてテールポインタを持つ単一リンクリストのみを使用することが知られています(テールポインタを後方に設定してください)。線形テーブルを(A1、a2、a3、a4、…、an-1、an、an-1、…、a4、a3、a2、a1)に変換するアルゴリズムを記述します。要件
:変換後の線形テーブルはテールポインタの後方一方向リンクリストを設定するために使用され、アルゴリズムには循環リストが1つだけあります。
分析
アイデア、結果は対称性についての線形テーブルです。
ステップ1:ポインターqがリンクリストをrear-> linkから順番にトラバースするようにします。
ステップ2:ポインターrがポイントしている場合は、リンクリストの最初のノードを記録します。
ステップ3:pが指すポイントがあると仮定して、qが指すノード情報をコピーします。
ステップ4:テールポインターの後ろにpを挿入します。
ステップ5:3番目と4番目のステップを繰り返します。
ステップ6:ループを形成するためにrが指す位置に後方を向けます。
例
初期時間:(a1、a2、a3、a4、a5、...、an)
変更後:(a1、a2、a3、a4、...、an-1、an、an-1、...、 a4、a3、a2、a1)
コード
// 合并单向循环链表
LinkList MERGELIST(LinkList rear){
LinkList p,q,r,s;
q=rear->link;
p=(LinkList)malloc(sizeof(BNode));
p->data = q->data; // 复制q所指的数据信息
r=p; // 记录第一个元素的位置
p->link=rear->link; // 将第一个元素插入链表末尾
rear->link=p;
q=q->link; // 指向第二个元素
while (q!=rear) {
s = q->link; // q所指的指针下移
p=(LinkList)malloc(sizeof(BNode)); // 申请空间 p->data=q->data; // 复制q所指的数据信息
p->link=rear->link; // 将p插入rear所指的后面 rear->link=p;
q=s; // 获得下一个处理的结点
}
rear=r; // 将尾指针指向r的位置,尾指针。
return rear;
}