演算法進行時 單鏈表(二)常見題型01

2021-07-27 09:09:44 字數 2756 閱讀 3073

1.用遞迴演算法,刪除帶結點的單鏈表l中所有值為x的結點。

由於是帶頭結點的,所以並且查詢值為x的結點時,從l->next的值開始判斷,

如果l->next的data等於x,那麼就要將l->next的值刪除並且將l的後繼結點換成l->next的後繼結點,並且將它刪除。

lnode *p = l->next ;

l->next=l->next->next;

free(p)

遞迴模型:

終止條件:

l->next == null

遞迴主體:

如果l->next->data= = x:

刪除l->next結點,並執行l->next=l->next->next操作,繼續執行下乙個結點值判斷。

如果l->next != x:

直接判斷下乙個結點。

lnode* delectlist(lnode*l, int x)

else}}

2.在頭結點的單鏈表,編寫演算法實現從尾到頭反向輸出每個結點的值。

第一種:

反向輸出,可以頭結點的後繼結點開始,直到l->next=null,用頭插法的方式將後面的結點插在頭結點後面,然後在依次列印。

第二種:

棧是一種後進先出的結構,遞迴就是用棧的思想實現的。

void r_print(lnode *l)

cout << l->data << endl;

}

3.將帶頭結點的鍊錶就地逆置(就地要求輔助空間複雜度為o(1))。

其實這幾道題的思想都差不多,這道題就是將頭結點取下然後將後續結點用頭插法的方式插入,直到最後乙個結點。

lnode* reverse_l(lnode *l)

return l;

}

4.將帶頭結點的鍊錶刪除最小值結點的高效演算法(最小結點唯一)

思路:第一步尋找最小值

第二步將最小值刪除

在尋找最小值時用需要從頭到尾一次比較,將最小值的前驅用指標儲存。

刪除時只需要將前驅的後繼結點指向改變即可。

空間複雜度為o(1),時間複雜度為o(n)

lnode* deletemin(lnode *l)

move = move->next;

} lnode *s = min->next;//要刪除的結點

min->next = min->next->next;//前驅結點的後繼結點改變

free(s);

return l;

}

全部**:

/*

instruction:linklist insertion

author:huangpingyi

date:2017/02/23

*/#include using namespace std;

struct lnode

;//尾插法

lnode* createlistt(lnode *l, int x, int array)

return q;

}//遞迴刪除值為x的結點

lnode* delectlist(lnode*l, int x)

else

}}//從頭到尾反向輸出結點

void r_print(lnode *l)

cout << l->data << endl;

}//就地逆置鍊錶

lnode* reverse_l(lnode *l)

return l;

}//刪除鍊錶中最小值結點

lnode* deletemin(lnode *l)

move = move->next;

} lnode *s = min->next;//要刪除的結點

min->next = min->next->next;//前驅結點的後繼結點改變

free(s);

return l;

}//列印結果

void print(lnode *l)

}int main()

lnode* l = new lnode;

createlistt(l, x, array);//d呼叫後為啥l不變

cout << "用尾插法建立鍊錶的結果:" << endl;

print(l);

int delect;

cout << "請輸入需要刪除的數" << endl;

cin >> delect;

delectlist(l, delect);

cout << "用遞迴法刪除x後結果" << endl;

print(l);

cout << "從頭到尾反向輸出結果" << endl;

r_print(l->next);

cout << "此時鍊錶的順序" << endl;

print(l);

reverse_l(l);

cout << "就地逆置後的結果:" << endl;

print(l);

cout << "刪除結點的最小值結果" << endl;

deletemin(l);

print(l);

system("pause");

return 0;

}

執行效果:

單鏈表的常見基礎演算法(二)

1 求單鏈表中的乙個最小值 2 單鏈表逆置 3 l為帶頭結點的單鏈表,實現從尾到頭反向輸出每個結點值 4 遞迴刪去不帶頭結點的單鏈表中所有值為x的結點 5 無序鍊錶中刪除所有值為x的結點並釋放其空間 6 帶頭結點的單鏈表中刪除所有介於給定的兩個值之間的元素 7 帶頭結點的單鏈表中刪除乙個最小值結點 ...

常見演算法 反轉單鏈表

使用3個指標,分別指示當前節點,當前節點的前乙個節點,以及後乙個節點。初始化前乙個節點為空。當節點個數大於1時,每遍歷乙個節點,更新它的next指標指向前乙個節點。同時更新前乙個節點和後乙個節點。直至當前節點指標為空,返回前乙個節點的指標。include using namespace std st...

演算法進行時 單鏈表(一)頭尾插法

鍊錶應該是當時學資料結構用得最多的了,面試的話考它的也多,它用的指標的時候也多,but 資料結構學了一年多了,差不多的都忘記了,打算開始複習一遍,畢竟靠它買 哈哈。鍊錶第一題first 鍊錶中首先開始學的最多就是用頭插法和尾插法 頭插法 每次都從頭開始插入結點。cout 用頭插法的結果 endl p...