單鏈表在線OJ題二(詳解+圖解)

1.在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針

在這里插入圖片描述
本題的意思是要刪除鏈表中重復出現的節點,然后返回刪除重復節點后的鏈表。
我們可以直接用一個哨兵位以便于觀察鏈表的情況,然后用前后指針來解決這個問題。如果當前節點cur的值與其當前節點的next的所存儲的值相等(且cur的next不為空),cur就變成cur的next,然后用while循環進行判斷,如果cur的val與cur的next的val相等且cur的next不為空,就然后cur往后移動,直到遇到不相同的情況,跳出循環后cur還要記得移動到cur的next;然后再將前指針prev的next置為cur,這樣就可以將相等的節點省略。當cur的next為空或者cur的值與cur的next的值不相等時,就直接先將prev置為cur,再將cur往后移動變成cur的next。最后返回哨兵位vpead的next,就是存儲了有效數據的首節點,就可以返回整個刪除后的單鏈表了。
在這里插入圖片描述

完整代碼如下:

struct ListNode *deleteDuplication(struct ListNode *pHead)
{struct ListNode *vHead;vHead = (struct ListNode *)malloc(sizeof(struct ListNode));vHead->next = pHead;//定義虛頭結點方便邊界情況討論struct ListNode *pre, *cur;pre = vHead, cur = pHead;while (cur){if (cur->next && cur->val == cur->next->val){cur = cur->next;while (cur->next && cur->val == cur->next->val)cur = cur->next;//當遇到與下一節點值相同時,cur推進到最后一個重復的數字處//本數字舍去,pre連接到下一個cur = cur->next;pre->next = cur;}//遇到與下一節點值不同或者是沒有下一節點時,pre移動到此處,cur繼續后移else if(!cur->next || cur->val != cur->next->val){pre = cur;cur = cur->next;}}return vHead->next;
}
2.對鏈表進行插入排序

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
本題也要使用到哨兵位,用哨兵位的next最后可以返回排序完后的鏈表,并且使用前后指針,進行大小比較,若是逆序則用前后指針的關系進行交換即可
完整代碼如下:

struct ListNode *insertionSortList(struct ListNode *head) 
{if (head == NULL) return head;struct ListNode *dummyHead = malloc(sizeof(struct ListNode));dummyHead->val = 0;dummyHead->next = head;//哨兵位struct ListNode *lastSorted = head;struct ListNode *curr = head->next;while (curr != NULL) {if (lastSorted->val <= curr->val) {lastSorted = lastSorted->next;} else {struct ListNode *prev = dummyHead;while (prev->next->val <= curr->val) {prev = prev->next;}lastSorted->next = curr->next;curr->next = prev->next;prev->next = curr;}curr = lastSorted->next;}return dummyHead->next;
}
3.給定一個鏈表,返回鏈表開始入環的第一個節點。 如果鏈表無環,則返回 NULL

在這里插入圖片描述
本題的意思很簡單,就是一個判斷鏈表是否有環的問題,如果有環就返回那個節點,看圖就明白了,就是最后一個節點的next會連接到前面的節點,就是有環。
到這里我們就要有一個大概的思路了–快慢指針!
我們用慢指針slow一次走一步,fast一次走兩步,到最后他們就一定會相遇,因為他們移動的差距只有一步一次追一步就必然會相遇。當slow和fast相遇時,我們再定義一個新指針從頭節點開始往后移動,同時將slow或者fast往后移動,當這個新指針與slow或者fast相等時這個節點就返回這個節點,這個節點就是鏈表尾鏈接到鏈表的節點。
在這里插入圖片描述

完整代碼如下:

struct ListNode* detectCycle(struct ListNode* head) 
{struct ListNode *slow = head, *fast = head;while (fast != NULL) {slow = slow->next;if (fast->next == NULL) {return NULL;}fast = fast->next->next;if (fast == slow) {struct ListNode* ptr = head;while (ptr != slow) {ptr = ptr->next;slow = slow->next;}return ptr;}}return NULL;
}
4.給定一個鏈表,判斷鏈表中是否有環

在這里插入圖片描述
有了上一題的思路,這一題就很簡單了,讓slow指針和fast指針分別往后移動,slow一次走一步,fast一次走兩步,如果二者能相遇(相遇即slow指針會與fast指針相等),那就是鏈表中有環,否則無環;
在這里插入圖片描述

完整代碼如下:

bool hasCycle(struct ListNode *head) 
{struct ListNode* slow=head;struct ListNode* fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(slow==fast)return true;}return false;
}
5.輸入兩個鏈表,找出它們的第一個公共結點

在這里插入圖片描述
其實這一題也很簡單
首先我們得判斷這個鏈表是否會相交,如果相交,那么兩個鏈表的尾節點就會相等,若不想等就直接返回NULL指針
其次我們分別求兩個鏈表的長度,用tail尾指針遍歷求出lenA,lenB
然后我們用lenA-lenB相減的絕對值就能得出兩個鏈表的長度差gap,讓長的鏈表先走gap步,然后短的鏈表再和長的鏈表一起走,當兩個鏈表的指針節點相等時,這個節點就是兩個鏈表相遇的節點,返回這個節點即可
在這里插入圖片描述

完整代碼如下:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{struct ListNode* tailA=headA;struct ListNode* tailB=headB;int lenA=1;int lenB=1;while(tailA){tailA=tailA->next;lenA++;}while(tailB){tailB=tailB->next;lenB++;}if(tailA!=tailB){return NULL;}int gap=abs(lenA-lenB);struct ListNode* longlist=headA;struct ListNode* shortlist=headB;if(lenA<lenB)//若長鏈表尾b則互換{longlist=headB;shortlist=headA;  }while(gap--){longlist=longlist->next;}while(longlist!=shortlist){longlist=longlist->next;shortlist=shortlist->next;}return longlist;
}

我們再OJ題的解題中可以發現,快慢指針的解題思路是非常重要的,大家可以多去做一點題 !
好了,今天的分享到這里就結束了,謝謝大家的支持!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160874.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160874.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160874.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【GIT】代碼倉庫服務器變更本地修改并推送

author: jwensh date: 20231122 問題背景 沒有使用域名的 gitlb 服務器搬移&#xff08;IP地址變了&#xff09;&#xff0c; 以至于 gitlab 管理的項目無法進行連接及推送。因為涉及到多個項目工程&#xff0c;所以可以用本地配置修改的方式來進行重新關聯&#xff08;這種修…

指針變量和地址

A.指針變量和地址 理解了內存和地址的關系&#xff0c;我們再回到C語?&#xff0c;在C語?中創建變量其實就是向內存申請空間&#xff0c;比如&#xff1a; #include <stdio.h> int main() {int a 10;return 0; } ?如&#xff0c;上述的代碼就是創建了整型變量a&…

spring-boot-admin-starter-server監控springboot項目

文章目錄 場景實現具體操作展示 場景 監控三件套Prometheus、Grafana、Alertmanager 部署起來太復雜,如果公司沒有運維而且項目很小就可以使用spring-boot-admin-starter-server替代。這個包使用起來還是很簡單的, 下面就實現一個對springCloud項目的監控 實現 參考 項目 具體操…

算法通關村第十二關|青銅|字符串轉換整數

1.轉換成小寫字母 原題&#xff1a;力扣709. 字符串大寫轉小寫有現成的API使用&#xff0c;但是我們也可以自己來實現。 使用或運算進行加操作能提高效率&#xff0c;因為 32 對應的二進制表示為 00100000 &#xff0c;而大寫字母的范圍 [65, 90] 的二進制表示在 00100000 的…

經典中的經典之字符串

前言&#xff1a;前段時間發燒了&#xff0c;所以耽誤了很多事情&#xff0c;一直沒有更新&#xff0c;多穿點衣服&#xff0c;感冒不好受。 接下來有時間就會陸續更新一些基礎的算法題&#xff0c;題目都很經典&#xff0c;大家可以先嘗試著做&#xff0c;再看 解析。 第一…

Windows常用cmd網絡命令詳解

中午好&#xff0c;我的網工朋友。 上回給你們梳理了一些有趣的cmd命令&#xff0c;很多朋友希望再拓展一下&#xff0c;這不就來了&#xff1f; 今天從windows切入&#xff0c;給你分享一些常用cmd網絡命令&#xff0c;如果能熟悉上手&#xff0c;很多功能都可以快速實現&am…

Java Class 類文件格式看這一篇就夠了

本文將揭開Java Class文件的神秘面紗&#xff0c;帶你了解Class文件的內部結構&#xff0c;并從Class文件結構的視角告訴你&#xff1a; 為什么Java Class字節碼文件可以“寫一次&#xff0c;遍地跑”&#xff1f;為什么常量池的計數從1開始&#xff0c;而不是和java等絕大多數…

封裝Redis工具類

基于StringRedisTemplate封裝一個緩存工具類&#xff0c;滿足下列需求&#xff1a; 方法1&#xff1a;將任意Java對象序列化為json并存儲在string類型的key中&#xff0c;并且可以設置TTL過期時間 方法2&#xff1a;將任意Java對象序列化為json并存儲在string類型的key中&…

【JVM精講與GC調優教程(概述)】

如何理解虛擬機(JVM)跨語言的平臺 java虛擬機根本不關心運行在其內部的程序到底是使用何種編程語言編寫的,他只關心“字節碼”文件。 java不是最強大的語言,但是JVN是最強大的虛擬機。 不存在內存溢出? 內存泄露? JAVA = (C++)–; 垃圾回收機制為我們打理了很多繁瑣的…

力扣刷題第二十八天--二叉樹

前言 今天的五道題都是層序遍歷的模板&#xff0c;深度優先的遞歸還不太熟。繼續努力。 內容 一、在每個樹行中找最大值 515.在每個樹行中找最大值 給定一棵二叉樹的根節點 root &#xff0c;請找出該二叉樹中每一層的最大值。 廣度優先搜素 時間復雜度&#xff1a;O(n)…

算法基礎:KMP算法詳細詳解

目錄 1、幾個最基本的概念 2、暴力算法 3、KMP算法 4、KMP代碼實現 5、時間復雜度 1、幾個最基本的概念 字符串的前綴&#xff1a; 主串&#xff08;目標串&#xff09;從索引0開始的子串被稱為主串的前綴。 字符串的后綴&#xff1a; 主串從索引大于0的位置到結尾的子串…

【人工智能入門學習資料福利】

總目錄如下&#xff08;部分截取&#xff09;&#xff1a; 百度網盤鏈接&#xff1a;https://pan.baidu.com/s/1bfDVG-xcPR3f3nfBJXxqQQ?pwdifu6 提取碼&#xff1a; ifu6

Sentinel在Spring Cloud中的流量控制與熔斷降級:保障你的微服務穩定運行

在當今高度互聯的世界中&#xff0c;微服務架構已成為構建穩健系統的基石。然而&#xff0c;隨著系統復雜性的增加&#xff0c;高并發和異常情況下&#xff0c;保障服務穩定性變得尤為關鍵。本文將帶你探索Spring Cloud中Sentinel框架的強大功能&#xff0c;它能夠為你的微服務…

協程及運用

協程 使用方法一方法二網頁下載中使用有返回值 實戰圖片實戰 一個線程多個任務&#xff0c;線程由操作系統開啟&#xff0c;比較耗資源。線程內合理分配任務&#xff0c;充分利用線程內的資源&#xff0c;一個任務io阻塞時&#xff0c;cpu處理其他非阻塞任務。 使用 方法一 i…

B站已經部分上線前臺實名,如不同意實名,后期賬號流量將收影響!

B站部分百萬粉絲博主的主頁顯示賬號運營人名字的政策是從10月31日開始的。當天&#xff0c;B站官方發布了《嗶哩嗶哩關于頭部“自媒體”賬號前臺實名的公告》&#xff0c;表明了其前臺實名制的實施計劃。 B站部分上線前臺實名的過程可以追溯到2021年。當時&#xff0c;中國政府…

window下殺指定端口進程

netstat -ano | findstr "8762" taskkill /pid 14992 /f

【LeetCode】144. 二叉樹的前序遍歷

144. 二叉樹的前序遍歷 難度&#xff1a;簡單 題目 給你二叉樹的根節點 root &#xff0c;返回它節點值的 前序 遍歷。 示例 1&#xff1a; 輸入&#xff1a;root [1,null,2,3] 輸出&#xff1a;[1,2,3]示例 2&#xff1a; 輸入&#xff1a;root [] 輸出&#xff1a;[]…

ARM裸機-18(SD卡啟動)

1、主流的外存設備介紹 內存和外存的區別&#xff1a;一般是把這種RAM(random access memory&#xff0c;隨機訪問存儲器&#xff0c;特點是任意字節讀寫&#xff0c;掉電丟失)叫內存&#xff0c;把ROM (read only memory&#xff0c;只讀存儲器&#xff0c;類似于Flash、SD卡之…

如何解決安卓手機無法預覽pdf文件而是需要直接下載的問題

在開發中常常會遇到需要在一個應用里打開一份pdf文件并預覽&#xff0c;經真機調試時發現在蘋果手機上打開pdf文件能正常預覽&#xff0c;但在安卓手機打開時卻會需要我們下載才能預覽&#xff0c;無法直接預覽 為了解決這個問題&#xff0c;我們采用安裝pdfH5插件的方式&…

計算機三級嵌入式知識總結(一)

一、ARM的七種異常類型 1、復位異常RESET “復位異常RESET”通常是指在電子設備或系統中發生了一個意外的復位或重啟。這可能是由于硬件故障、軟件問題或其他未知的原因引起的。當設備經歷復位異常時&#xff0c;它可能會丟失正在進行的操作或設置&#xff0c;導致數據丟失或系…