日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#刷剑指Offer | 在O(1)时间删除链表节点

發(fā)布時間:2023/12/4 C# 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#刷剑指Offer | 在O(1)时间删除链表节点 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【C#刷題|?作者?/ Edison Zhou


我們來用之前學(xué)到的數(shù)據(jù)結(jié)構(gòu)知識來刷《劍指Offer》的一些核心題目(精選了其中30+道題目),希望對你有幫助!本文題目為:在O(1)時間刪除鏈表節(jié)點。

1題目介紹

題目:給定單向鏈表的頭指針和一個結(jié)點指針,定義一個函數(shù)在O(1)時間刪除該結(jié)點。

《劍指Offer》一書中使用的C/C++來定義節(jié)點,我們這里使用C#來定義節(jié)點:

public class Node<T> {// 數(shù)據(jù)域public T Item { get; set; }// 指針域public Node<T> Next { get; set; }public Node() {}public Node(T item) {this.Item = item;} }

我們最終要實現(xiàn)的DeleteNode方法定義如下:

public static void DeleteNode(Node<int> headNode, Node<int> deleteNode) { }

2解法1:常規(guī)思路

在單向鏈表中刪除一個結(jié)點,最常規(guī)的做法無疑是從鏈表的頭結(jié)點開始,順序遍歷查找要刪除的結(jié)點,并在鏈表中刪除該結(jié)點。這種思路由于需要順序查找,時間復(fù)雜度自然就是O(n)

3解法2:正確思路

是不是一定需要得到被刪除的結(jié)點的前一個結(jié)點呢?答案是否定的。

我們可以很方便地得到要刪除的結(jié)點的下一個結(jié)點。因此,我們可以把下一個結(jié)點的內(nèi)容復(fù)制到需要刪除的結(jié)點上覆蓋原有的內(nèi)容,再把下一個結(jié)點刪除,就相當(dāng)于把當(dāng)前需要刪除的結(jié)點刪除了。

但是,還有兩個特殊情況需要進行考慮:

(1)如果要刪除的結(jié)點位于鏈表的尾部,那么它就沒有下一個結(jié)點:

此時我們?nèi)匀粡逆湵淼念^結(jié)點開始,順序遍歷得到該結(jié)點的前序結(jié)點,并完成刪除操作,這仍然屬于O(n)時間的操作。

(2)如果鏈表中只有一個結(jié)點,而我們又要刪除鏈表的頭結(jié)點(也是尾結(jié)點):

此時我們在刪除結(jié)點之后,還需要把鏈表的頭結(jié)點設(shè)置為NULL。

最后,通過綜合最壞情況(尾節(jié)點需要順序查找,1次)和最好情況(n-1次),因此平均時間復(fù)雜度為O(1)

需要注意的是:受到O(1)時間的限制,我們不得不把確保結(jié)點在鏈表中的責(zé)任推給了方法DeleteNode的調(diào)用者

下面是DeleteNode方法的C#代碼實現(xiàn):

public static void DeleteNode(Node<int> headNode, Node<int> deleteNode) {if (headNode == null || deleteNode == null){return;}if (deleteNode.Next != null) // 鏈表有多個節(jié)點,要刪除的不是尾節(jié)點:O(1)時間{Node<int> tempNode = deleteNode.Next;deleteNode.Item = tempNode.Item;deleteNode.Next = tempNode.Next;tempNode = null;}else if (headNode == deleteNode) // 鏈表只有一個結(jié)點,刪除頭結(jié)點(也是尾結(jié)點):O(1)時間{deleteNode = null;headNode = null;}else // 鏈表有多個節(jié)點,要刪除的是尾節(jié)點:O(n)時間{Node<int> tempNode = headNode;while(tempNode.Next != deleteNode){tempNode = tempNode.Next;}tempNode.Next = null;deleteNode = null;} }

4單元測試

老規(guī)矩,仍然需要為我們的代碼寫單元測試,這也是一個好習(xí)慣哦!

首先,為了后面測試驗證方便,這里我們先封裝一個測試輔助方法GetPrintNodes用于對比實際值與期望值是否一致:

public static string GetPrintNodes(Node<int> headNode) {if (headNode == null){return string.Empty;}StringBuilder sbNodes = new StringBuilder();while(headNode != null){sbNodes.Append(headNode.Item);headNode = headNode.Next;}return sbNodes.ToString(); }

其次,測試代碼:

// 鏈表中有多個結(jié)點,刪除中間的結(jié)點 [TestMethod] public void DeleteNodeTest1() {Node<int> head1 = new Node<int>(1);Node<int> head2 = new Node<int>(2);Node<int> head3 = new Node<int>(3);Node<int> head4 = new Node<int>(4);Node<int> head5 = new Node<int>(5);head1.Next = head2;head2.Next = head3;head3.Next = head4;head4.Next = head5;Program.DeleteNode(head1, head3);Assert.AreEqual(Program.GetPrintNodes(head1),"1245"); }// 鏈表中有多個結(jié)點,刪除尾結(jié)點 [TestMethod] public void DeleteNodeTest2() {Node<int> head1 = new Node<int>(1);Node<int> head2 = new Node<int>(2);Node<int> head3 = new Node<int>(3);Node<int> head4 = new Node<int>(4);Node<int> head5 = new Node<int>(5);head1.Next = head2;head2.Next = head3;head3.Next = head4;head4.Next = head5;Program.DeleteNode(head1, head5);Assert.AreEqual(Program.GetPrintNodes(head1), "1234"); }// 鏈表中有多個結(jié)點,刪除頭結(jié)點 [TestMethod] public void DeleteNodeTest3() {Node<int> head1 = new Node<int>(1);Node<int> head2 = new Node<int>(2);Node<int> head3 = new Node<int>(3);Node<int> head4 = new Node<int>(4);Node<int> head5 = new Node<int>(5);head1.Next = head2;head2.Next = head3;head3.Next = head4;head4.Next = head5;Program.DeleteNode(head1, head1);Assert.AreEqual(Program.GetPrintNodes(head1), "2345"); }// 鏈表中只有一個結(jié)點,刪除頭結(jié)點 [TestMethod] public void DeleteNodeTest4() {Node<int> head1 = new Node<int>(1);Program.DeleteNode(head1, head1);head1 = null;Assert.AreEqual(Program.GetPrintNodes(head1), ""); }// 鏈表為空 [TestMethod] public void DeleteNodeTest5() {Program.DeleteNode(null, null);Assert.AreEqual(Program.GetPrintNodes(null), ""); }

最后,測試結(jié)果如下:

代碼覆蓋率如下:

Ref參考資料

何海濤,《劍指Offer》

后臺回復(fù):劍指offer,即可獲得pdf下載鏈接喲!

專注于開發(fā)技術(shù)與個人成長分享,

對你有用的公眾號!

????點擊獲取文章源碼

總結(jié)

以上是生活随笔為你收集整理的C#刷剑指Offer | 在O(1)时间删除链表节点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本3级网站 | 欧美最猛性xxxxx(亚洲精品) | 最近中文字幕第一页 | 三级a做爰全过程 | 亚洲av成人精品一区二区三区 | 国产午夜精品一区二区 | 免费成人深夜夜国外 | 成人短视频在线免费观看 | 人妻一区二区三区视频 | 特黄a级片| 日本一级黄 | 国产乱人伦app精品久久 | 人妻无码一区二区三区久久99 | 99re在线国产 | gv天堂gv无码男同在线观看 | 可以免费观看av | 四虎永久地址 | 成人国产精品免费观看 | 黄色在线观看视频网站 | 亚洲色精品三区二区一区 | 一区二区高清视频 | 美女色诱男人激情视频 | 依依成人综合 | 99视频只有精品 | 精品亚洲一区二区三区 | 成人国产毛片 | 成人自拍视频在线 | 免费啪视频在线观看 | 亚洲一本之道 | 午夜成人亚洲理伦片在线观看 | 欧美性大交 | 欧美一区二区三区久久成人精品 | 日干夜干 | 国产精品久久毛片av大全日韩 | 国产麻豆精品在线 | 国产偷啪| 亚洲欧美日韩在线不卡 | 中国老太婆性做爰 | 日日日日日日bbbbbb | 欧美成网站 | 欧美福利视频在线 | 日韩国产精品一区 | 91青草视频| 国产美女无遮挡免费视频 | 学生孕妇videosex性欧美 | 手机看黄色 | 国产精品久久影院 | 国产福利小视频在线观看 | 波多野结衣精品视频 | 福利免费视频 | 成年人免费视频播放 | 免费观看视频一区二区 | 波多野结衣精品视频 | 91高跟黑色丝袜呻吟在线观看 | 国产99色 | 西西人体做爰大胆gogo | 欧美又粗又长又爽做受 | 一级片啪啪 | 欧美精品久久 | 五月婷婷激情在线 | 九九天堂网| 影音先锋中文字幕在线视频 | 一级中文片| 日韩成人精品 | 日韩不卡在线视频 | 日本在线观看免费 | 免费黄色高清视频 | 黄色顶级片 | 久久久久久久久蜜桃 | 日韩欧美在线观看视频 | 亚洲插插| 1769国产 | 春闺艳妇(h)高h产乳 | 91xxxxx| 青青青青青青青青草 | 亚洲xxxx天美 | www国产一区 | www一区二区三区 | 黄色片在哪看 | 99热6这里只有精品 三级av在线免费观看 | 国产xxx| 一本到在线 | 亚洲男人的天堂在线视频 | 久久久久久久久久一区二区 | 国产成人欧美一区二区三区的 | 环太平洋3:泰坦崛起 | 欧美激情不卡 | 神马久久av| 综合久久影院 | 久久字幕| 被两个男人吃奶三p爽文 | 久久久wwww| 亚洲无码高清精品 | 午夜综合网 | 91精彩视频在线观看 | r级无码视频在线观看 | 亚洲系列第一页 | 97插插插 | 91av在线视频播放 |