国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 學院 > 開發設計 > 正文

單鏈表編程題

2019-11-06 06:32:30
字體:
來源:轉載
供稿:網友

找出單鏈表的中間元素 算法思想:使用兩個指針first和second,只是first每次走一步,second每次走兩步:

static Link GetMiddleOne(Link head){Link first = head;Link second = head;while (first != null && first.Next != null){first = first.Next.Next;second = second.Next;}return second;}

但是,這道題目有個地方需要注意,就是對于鏈表元素個數為奇數,以上算法成立。如果鏈表元素個數為偶數,那么在返回second的同時,還要返回second.Next也就是下一個元素,它倆都算是單鏈表的中間元素。 下面是加強版的算法,無論奇數偶數,一概通殺:

static void Main(string[] args){Link head = GenerateLink();bool isOdd = true;Link middle = GetMiddleOne(head, ref isOdd);if (isOdd){Console.WriteLine(middle.Data);}else{Console.WriteLine(middle.Data);Console.WriteLine(middle.Next.Data);}Console.Read();}static Link GetMiddleOne(Link head, ref bool isOdd){Link first = head;Link second = head;while (first != null && first.Next != null){first = first.Next.Next;second = second.Next;}if (first != null)isOdd = false;return second;}

兩個不交叉的有序鏈表的合并 有兩個有序鏈表,各自內部是有序的,但是兩個鏈表之間是無序的。 算法思路:當然是循環逐項比較兩個鏈表了,如果一個到了頭,就不比較了,直接加上去。 注意,對于2個元素的Data相等(僅僅是Data相等哦,而不是相同的引用),我們可以把它視作前面的Data大于后面的Data,從而節省了算法邏輯。

static Link MergeTwoLink(Link head1, Link head2){Link head = new Link(null, Int16.MinValue);Link PRe = head;Link curr = head.Next;Link curr1 = head1;Link curr2 = head2;//compare until one link run to the endwhile (curr1.Next != null && curr2.Next != null){if (curr1.Next.Data < curr2.Next.Data){curr = new Link(null, curr1.Next.Data);curr1 = curr1.Next;}else{curr = new Link(null, curr2.Next.Data);curr2 = curr2.Next;}pre.Next = curr;pre = pre.Next;}//if head1 run to the endwhile (curr1.Next != null){curr = new Link(null, curr1.Next.Data);curr1 = curr1.Next;pre.Next = curr;pre = pre.Next;}//if head2 run to the endwhile (curr2.Next != null){curr = new Link(null, curr2.Next.Data);curr2 = curr2.Next;pre.Next = curr;pre = pre.Next;}return head;}

如果這兩個有序鏈表交叉組成了Y型呢,比如說: 這時我們需要先找出這個交叉點。 然后局部修改上面的算法,只要其中一個鏈表到達了交叉點,就直接把另一個鏈表的剩余元素都加上去。如下所示:

static Link MergeTwoLink2(Link head1, Link head2){Link head = new Link(null, Int16.MinValue);Link pre = head;Link curr = head.Next;Link intersect = GetIntersect(head1, head2);Link curr1 = head1;Link curr2 = head2;//compare until one link run to the intersectwhile (curr1.Next != intersect && curr2.Next != intersect){if (curr1.Next.Data < curr2.Next.Data){curr = new Link(null, curr1.Next.Data);curr1 = curr1.Next;}else{curr = new Link(null, curr2.Next.Data);curr2 = curr2.Next;}pre.Next = curr;pre = pre.Next;}//if head1 run to the intersectif (curr1.Next == intersect){while (curr2.Next != null){curr = new Link(null, curr2.Next.Data);curr2 = curr2.Next;pre.Next = curr;pre = pre.Next;}}//if head2 run to the intersectelse if (curr2.Next == intersect){while (curr1.Next != null){curr = new Link(null, curr1.Next.Data);curr1 = curr1.Next;pre.Next = curr;pre = pre.Next;}}return head;}

兩個單鏈表相交,計算相交點 分別遍歷兩個單鏈表,計算出它們的長度M和N,假設M比N大,則長度M的鏈表先前進M-N,然后兩個鏈表同時以步長1前進,前進的同時比較當前的元素,如果相同,則必是交點。

public static Link GetIntersect(Link head1, Link head2){Link curr1 = head1;Link curr2 = head2;int M = 0, N = 0;//goto the end of the link1while (curr1.Next != null){curr1 = curr1.Next;M++;}//goto the end of the link2while (curr2.Next != null){curr2 = curr2.Next;N++;}//return to the begining of the linkcurr1 = head1;curr2 = head2;if (M > N){for (int i = 0; i < M – N; i++)curr1 = curr1.Next;}else if (M < N){for (int i = 0; i < N – M; i++)curr2 = curr2.Next;}while (curr1.Next != null){if (curr1 == curr2){return curr1;}curr1 = curr1.Next;curr2 = curr2.Next;}return null;}

單鏈表排序 無外乎是冒泡、選擇、插入等排序方法。關鍵是交換算法,需要額外考慮。本題的排序過程中,我們可以在外層和內層循環里面,捕捉到pre1和pre2,然后進行交換,而無需每次交換又要遍歷一次單鏈表。在實踐中,我發現冒泡排序和選擇排序都要求內層循環從鏈表的末尾向前走,這明顯是不合時宜的。所以我最終選擇了插入排序算法,如下所示: 先給出基于數組的算法:

static int[]InsertSort(int[] arr){for(int i=1; i<arr.Length;i++){for(int j =i; (j>0)&&arr[j]<arr[j-1];j–){arr[j]=arr[j]^arr[j-1];arr[j-1]=arr[j]^arr[j-1];arr[j]=arr[j]^arr[j-1];}}return arr;}

仿照上面的思想,我們來編寫基于Link的算法:

public static Link SortLink(Link head){Link pre1 = head;Link pre2 = head.Next;Link min = null;for (Link curr1 = head.Next; curr1 != null; curr1 = min.Next){if (curr1.Next == null)break;min = curr1;for (Link curr2 = curr1.Next; curr2 != null; curr2 = curr2.Next){//swap curr1 and curr2if (curr2.Data < curr1.Data){min = curr2;curr2 = curr1;curr1 = min;pre1.Next = curr1;curr2.Next = curr1.Next;curr1.Next = pre2;//if exchange element n-1 and n, no need to add reference from pre2 to curr2, because they are the same oneif (pre2 != curr2)pre2.Next = curr2;}pre2 = curr2;}pre1 = min;pre2 = min.Next;}return head;}

值得注意的是,很多人的算法不能交換相鄰兩個元素,這是因為pre2和curr2是相等的,如果此時還執行pre2.Next = curr2; 會造成一個自己引用自己的環。 交換指針很是麻煩,而且效率也不高,需要經常排序的東西最好不要用鏈表來實現,還是數組好一些。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
www.av在线视频| 不卡av免费观看| 国产永久免费高清在线观看| 天天噜天天色| 青青草免费在线视频| 一本大道久久精品| 青青青国产视频| 99视频免费在线观看| 国产精品秘入口| 一区二区三区免费视频网站| 欧美高清视频| 91视频黄色| 综合激情丁香| 午夜影院在线| 国产98在线| 午夜视频免费在线观看| 2020国产在线视频| 中文字幕国产在线| 免费午夜一级| 日本片在线看| 国产福利在线| 超碰免费在线观看| 在线播放www| 国产一二三区在线视频| 四虎成人免费观看在线网址| 最近中文字幕av免费高清 | 日本在线免费中文字幕| 国产欧美日本亚洲精品一4区| 欧洲有码在线视频| 日本高清中文字幕在线| 一区免费观看| 精品国语对白精品自拍视| 香蕉视频网站在线观看| 91亚洲天堂| 国产黄色片中文字幕| 国产一区二区三区不卡在线| 豆国产97在线|亚洲| 不卡av免费观看| www黄在线观看| 人人九九精品| 国产在线播放av| 综合蜜桃精品| 国产区在线看| 9色在线视频网站| 在线a人片免费观看视频| 精品国产二区三区| www免费在线观看视频| 中文在线观看视频| 天天干天天操天天爽| 日本h片在线观看| 国产农村一级特黄α**毛片| 成在在线免费视频| 国产无遮挡又黄又爽免费网站 | 国产wwww| 亚洲精品在线播放视频| 欧美96在线| 中文字幕在线视频免费观看| 国产性一级片| 在线a人片免费观看视频| 日本卡一卡2卡3卡4精品卡网站| 六月天色婷婷| 国产人成在线视频| 超碰91在线| 国产污污在线观看| 天天激情综合| 国产黄色在线网站| 久久综合第一页| 一区二区精品区| 国产在线高潮| 依依成人在线| 国产精品剧情一区二区三区| 亚洲精品aaaa精品| 国产区视频在线| 在线视频二区| 国产性色视频| 福利资源在线久| 羞羞视频在线观看免费| 国产精品美女一区二区三区四区| www.色五月| 亚洲色婷婷综合开心网| 国产三级在线播放| 国产在线高潮| 激情丁香久久| 国产中文在线观看| 麻豆av在线| 就爱干草视频| 免费观看v片在线观看| 四虎成人免费观看在线网址| 国产福利三区| 国产成人天天5g影院| 国产乱视频在线观看| аⅴ成人天堂中文在线| 亚洲精品少妇久久久久久| 在线亚洲精品自拍| av日韩在线免费| 日本欧洲一区| 国产在线观看a| 国产精品一品| 国产区在线观看| 国产高清视频在线播放| 国产福利在线播放麻豆| 国产二区视频在线观看| 精品视频二区三区| 在线观看精品视频一区二区三区| 国产精品爱久久久久久久小说| 国产一级免费看| 国产国语**毛片高清视频| 国产人成在线视频| 国产精品xxx电影| 在线中文字幕观看| eeuss影院www在线观看| 免费a在线看| 国产区视频在线| 一本免费视频| 91超碰国产在线| 亚洲最新永久在线观看| 欧美视频免费一区二区三区| 国产69精品久久app免费版 | 69国产精品视频| 天天插天天色| 中文字幕在线看精品乱码| 在线一区观看| 国产乱妇乱子在线播视频播放网站 | 国产美女高潮| 国产成人综合美国十次| 日本电影在线观看| 国产免费网址| av在线播放av| 国产精品合集一区二区| xxxxx中文字幕| 国产不卡视频| 午夜国产视频| 久久99精品久久久久久野外| 国产三区四区在线观看| 人人九九精品| av超碰在线| 国产情侣高潮对白| 导航福利在线| 99在线免费视频| 国产精品视频一区麻豆| 丁香花高清视频完整版在线观看| 97最新国自产拍视频在线完整在线看| 嫩草在线播放| 天堂中文在线观看| av色在线观看| 99re热在线观看| 91在线网站| 精品入口蜜桃| 精品电影在线| 国产精品99爱免费视频| 中文字幕在线免费视频| 黄网址在线永久免费观看| www.91在线播放| 亚洲日本一区二区三区在线观看| 国产黄色片大全| 国产精品入口麻豆电影| 国产精品入口免费麻豆| 九九精品九九| 国产美女在线看| 国产午夜电影| 7777在线| 操人视频91| 丁香花高清视频完整版在线观看| 九九在线观看免费视频| 国产91大片| 国产天堂av| 精品国产白色丝袜高跟鞋| 国产a级网站| 伊人免费视频| www在线免费观看视频| 久热免费在线视频| 国产麻豆一区二区三区精品| 尤物网在线观看| 2018中文字幕在线| 欧美aaa一级片| 国产在线超碰| 国产aa视频| 久久精品蜜桃| 国产色在线播放| jlzzjlzz欧美大全| 国产三级在线观看| www操操操| 国产精品777一区二区| 精品视频一二区| 黄污在线观看| 一二三四区在线观看| 狠狠操狠狠色| 91中文字幕| 国产毛片视频| 一本大道久久精品| 国产精品你懂的在线观看 | 亚色视频在线观看| 国产乱妇乱子在线播视频播放网站| 国产精品久久久久一区二区国产 | 国产精品自拍亚洲| 伊人中文字幕在线| 国产精品人人| 五月亚洲综合| 国产在线二区| 久久精品最新免费国产成人|