數據結構:力扣OJ題

目錄

?編輯題一:鏈表分割

思路一:

題二:相交鏈表

思路一:

題三:環形鏈表

?思路一:

題四:鏈表的回文結構

思路一:

鏈表反轉:

查找中間節點:

本人實力有限可能對一些地方解釋的不夠清晰,可以自己嘗試讀代碼,望海涵!


題一:鏈表分割

現有一鏈表的頭指針 ListNode*?pHead,給一定值x,編寫一段代碼將所有小于x的結點排在其余結點之前,且不能改變原來的數據順序,返回重新排列后的鏈表的頭指針。

思路一:

1.分別創建一個記錄小于x的“小”結構體,和記錄大于等于x的“大”結構體

2.然后malloc函數動態開辟一個結構體大小的空間,這時head和tail都指向同一位置,將phead->val與x比較,小于想,放入less中,大于等于x放入great中,

3.當phead為NULL時,將兩個“大”“小”結構體鏈接起來,記錄lesshead節點,然后free釋放開辟的動態內存空間,返回記錄lesshead的地址。

    ListNode* partition(ListNode* phead, int x) {struct ListNode* head = phead ; struct ListNode* lesshead ;struct ListNode* greathead ; struct ListNode* lesstail ; struct ListNode* greattail ; //動態開辟空間lesshead = lesstail = (struct ListNode*)malloc(sizeof(struct ListNode));greathead = greattail = (struct ListNode*)malloc(sizeof(struct ListNode));while(head){//小于x的尾插到lessTailif(head->val < x){lesstail->next  = head;lesstail = lesstail->next;            }//大于等于x的尾插到greaterTailelse{greattail->next  = head;greattail = greattail->next; }//下一個位置head = head->next;  }//小的接上大的lesstail->next = greathead->next;greattail->next = NULL;//新頭節點struct ListNode* Phead = lesshead->next;//銷毀free(lesshead);free(greathead);return Phead;}

題二:相交鏈表

給你兩個單鏈表的頭節點?headA?和?headB?,請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表不存在相交節點,返回?null?。

圖示兩個鏈表在節點?c1?開始相交

題目數據?保證?整個鏈式結構中不存在環。

注意,函數返回結果后,鏈表必須?保持其原始結構?。

思路一:

1.先分別將A和B遍歷一遍,計算出長度len
2.計算長度差Slen,讓長的先指向Slen個next位置
3.此時再同時遍歷,直到A和B的地址相同
4.返回的就是第一個交點

?

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{struct ListNode* curA = headA,*curB = headB;int len1 = 1,len2 = 1; //計算鏈表長度while(curA){curA = curA->next;len1++;}while(curB){curB = curB->next;len2++;}//如果此時遍歷結束地址不相等,說明沒有相交點if(curA != curB){return NULL;}//abs是計算差值絕對值函數int Slen = abs(len1 - len2);//二次遍歷的長短鏈表struct ListNode* longlist = headA,*shortlist = headB;if(len1 <  len2){longlist = headB;shortlist = headA;}//讓longlist和shortlist的長度相同while(Slen--){longlist = longlist->next;}//找到第一個交點while(longlist != shortlist){longlist = longlist->next;shortlist = shortlist->next;}//輸出交點地址return longlist;
}

題三:環形鏈表

給你一個鏈表的頭節點?head?,判斷鏈表中是否有環。

如果鏈表中有某個節點,可以通過連續跟蹤?next?指針再次到達,則鏈表中存在環。 為了表示給定鏈表中的環,評測系統內部使用整數?pos?來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。注意:pos?不作為參數進行傳遞?。僅僅是為了標識鏈表的實際情況。

如果鏈表中存在環?,則返回?true?。 否則,返回?false?。

示例 1:

?思路一:

快慢指針思路:
1.創建快慢指針fast和slow;
2.開始位置相同,slow每次指向下一個地址, fast每次指向下下個地址;
3.循環判斷,直到slow=fast地址相同

4,相同則說明鏈表存在環
反之,fast或fast->next尾NULL則不存在環

bool hasCycle(struct ListNode *head)
{struct ListNode* slow = head;struct ListNode* fast = head;//fast或fast->next尾NULL則不存在環while(fast && fast->next){//slow每次指向下一個地址, fast每次指向下下個地址slow = slow->next;fast = fast->next->next;//相同則說明鏈表存在環if(slow == fast){return true;}}return false;
}

題四:鏈表的回文結構

思路一:

如下:兩種方法,得到的節點去循環判斷,如果newnode或者head一個為NULL,則說明是回文結構,如果在循環中結束·,則不是回文結構。

鏈表反轉:

三個變量n1=NULL,n2=head,n3,如果n2不為NULL,則n3=n2->next,循環如果n2為NULL,就停下來,當n3為空時n3就不進行變化,最后n1會停在最后一個位置,這個時候逆置完成。

查找中間節點:

分別定義快慢兩個指針,快指針一次前進兩個地址,慢指針一次前進一個地址,當奇數時快指針的next為NULL時,當鏈表為偶數時判斷條件為地址為NULL,停下來,此時慢指針就在鏈表中間節點上。

//將鏈表反轉
struct ListNode* reverseList(struct ListNode* head)
{struct ListNode* n1,*n2,*n3;n1 = NULL;n2 = head;if(n2)n3 = n2->next;while(n2){n2->next = n1;n1 = n2;n2 = n3;if(n3)n3 = n3->next;}return n1;
}
//得到鏈表中間節點
struct ListNode* middleNode(struct ListNode* head)
{struct ListNode* slow = head;struct ListNode* fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;
}
class PalindromeList {
public:bool chkPalindrome(ListNode* head) {struct ListNode* mid = middleNode(head);struct ListNode* newnode = reverseList(mid);//一個為空自己退出while(newnode && head){//不相同,則不是回文結構if(newnode->val != head->val){return false;}newnode = newnode->next;head = head->next; }return true;}
};

本人實力有限可能對一些地方解釋的不夠清晰,可以自己嘗試讀代碼,望海涵!

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

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

相關文章

YOLOv8+ByteTrack多目標跟蹤(行人車輛計數與越界識別)

課程鏈接&#xff1a;https://edu.csdn.net/course/detail/38901 ByteTrack是發表于2022年的ECCV國際會議的先進的多目標跟蹤算法。YOLOv8代碼中已集成了ByteTrack。本課程使用YOLOv8和ByteTrack對視頻中的行人、車輛做多目標跟蹤計數與越界識別&#xff0c;開展YOLOv8目標檢測…

Leetcode每日一題:23. 合并 K 個升序鏈表(2023.8.12 C++)

目錄 23. 合并 K 個升序鏈表 題目描述&#xff1a; 實現代碼與解析&#xff1a; 優先級隊列&#xff1a; 原理思路&#xff1a; 23. 合并 K 個升序鏈表 題目描述&#xff1a; 給你一個鏈表數組&#xff0c;每個鏈表都已經按升序排列。 請你將所有鏈表合并到一個升序鏈表…

Flutter: A RenderFlex overflowed by 42 pixels on the bottom.

Flutter&#xff1a;渲染活動底部上方溢出了42個像素 Flutter 控件超出異常&#xff1a;A RenderFlex overflowed by 42 pixels on the bottom. 解決方案 1.Scaffold內添加 resizeToAvoidBottomInset 屬性&#xff0c;缺點是軟鍵盤下面的控件被擋住 Scaffold( resizeToAvoidBot…

第一百二十七天學習記錄:我的創作紀念日

機緣 今天收到CSDN官方的來信&#xff0c;想想也可以對我前面的學習記錄進行一個總結。 關于來到CSDN的初心&#xff0c;也就是為了讓自己養成一個良好的學習總結的習慣。這里要感謝我C語言視頻教程的老師&#xff0c;是他建議學生們在技術博客中進行記錄。對于技術博客&…

web-Element

在vueapp里<div><!-- <h1>{{message}}</h1> --><element-view></element-view></div> <div><!-- <h1>{{message}}</h1> --><element-view></element-view></div>在view新建個文件 <t…

C++ VTK 8.2 如何繪制彈簧圖形

//創建圓柱 vtkSmartPointer<vtkCylinderSource> spCylinderSource vtkSmartPointer<vtkCylinderSource>::New(); spCylinderSource->SetHeight(m_dCylinderHeight); // 設置圓柱的高度 spCylinderSource->SetRadius(m_dCylinderRadius)…

Spring(12) BeanFactory 和 ApplicationContext 區別

目錄 一、BeanFactory 和 ApplicationContext 區別&#xff1f;二、既然 Spring Boot 中使用的是 ApplicationContext 進行應用程序的啟動和管理&#xff0c;那么 Spring Boot 會用到 BeanFactory 嗎&#xff1f; 一、BeanFactory 和 ApplicationContext 區別&#xff1f; Bea…

git clone使用https協議報錯OpenSSL SSL_read: Connection was reset, errno 10054

在使用git 下載github上的代碼時&#xff0c; 一般有ssh協議和https協議兩種。使用ssh協議可以成功clone代碼&#xff0c; 但使用https協議時出錯&#xff1a; $ git clone https://github.com/openai/improved-diffusion.git Cloning into improved-diffusion... fatal: unab…

vue或uniapp使用pdf.js預覽

一、先下載穩定版的pdf.js&#xff0c;可以去官網下載 官網下載地址 或 pdf.js包下載(已配置好&#xff0c;無需修改) 二、下載好的pdf.js文件放在public下靜態文件里&#xff0c; uniapp是放在 static下靜態文件里 三、使用方式 1. vue項目 注意路徑 :src"static/pd…

每日一題 206反轉鏈表

題目 給你單鏈表的頭節點 head &#xff0c;請你反轉鏈表&#xff0c;并返回反轉后的鏈表。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5] 輸出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 輸入&#xff1a;head [1,2] 輸出&#xff1a;[2,1]示例 3&#xff1a; …

塊、行內塊水平垂直居中

1.定位實現水平垂直居中 <div class"outer"><div class"test inner1">定位實現水平垂直居中</div></div><style>.outer {width: 300px;height: 300px;border: 1px solid gray;margin: 100px auto 0;position: relative;}.te…

途樂證券-新股行情持續火爆,哪些因素影響首日表現?

全面注冊制以來&#xff0c;參加打新的投資者數量全體呈現下降。打新收益下降&#xff0c;破發頻出的布景下&#xff0c;投資者打新策略從逢新必打逐步向優選個股改變。 經過很多歷史數據&#xff0c;從商場定價、參加者熱度以及機構重視度維度揭秘了上市后股價體現優秀的個股具…

在多頁面應用和單頁面應用中(例如vue)怎么提高seo搜索引擎優化

那么 我們要先知道 搜索引擎是怎么工作的&#xff1f; 搜索引擎是通過一系列步驟來工作的&#xff0c;以下是其基本原理&#xff1a; 1、網絡爬蟲&#xff1a;搜索引擎使用網絡爬蟲&#xff08;也稱為蜘蛛、機器人&#xff09;來從互聯網上抓取網頁。網絡爬蟲按照預定義的規則…

Redis 之 緩存預熱 緩存雪崩 緩存擊穿 緩存穿透

目錄 一、緩存預熱 1.1 緩存預熱是什么&#xff1f; 1.2 解決方案&#xff1a; 二、緩存雪崩 2.1 緩存雪崩是什么&#xff1f;怎么發生的&#xff1f; 2.2 怎么解決 三、緩存穿透 3.1 是什么&#xff1f;怎么產生的呢&#xff1f; 3.2 解決方案 3.2.1、采用回寫增強&a…

Ceph入門到精通-分布式存儲產品的測試實踐

分布式存儲產品的測試實踐 在分布式存儲產品的測試過程中&#xff0c;測試到底做了些什么事情呢&#xff1f; 一&#xff1a;測試工作內容 需求&#xff0c;設計評審 測試需要參與到每一個過程中 在設計評審的時候就需要知道驗收的標準&#xff0c;這是最重要的開始。因為這…

SpringBoot基礎之注冊Servlet三大組件

文章目錄 前言一、介紹二、注入Bean2.1.ServletRegistrationBean2.2.FilterRegistrationBean2.3.ServletListenerRegistrationBean 三.演示結果總結 前言 本文章將介紹SpringBoot注冊Servlet的三大組件 一、介紹 由于SpringBoot默認是以jar包的方式運行嵌入式Servlet容器來啟…

Protues如何安裝下載使用:STM32利用Protues進行仿真

文章目錄&#xff1a; 一&#xff1a;Proteus仿真的使用步驟 第一步&#xff1a;Proteus新建項目 第二步&#xff1a;Proteus設計電路圖&#xff08;選取元器件、擺放元器件、編輯元器件屬性、原理圖布線&#xff09; 第三步&#xff1a;程序代碼編寫 第四步&#xff1a;…

窺孔優化(Peephole Optimization)

窺孔優化&#xff08;Peephole Optimization&#xff09;是編譯器中的一個技術&#xff0c;用于優化生成的中間代碼或目標代碼。該優化方法通過查看代碼的小部分&#xff08;或稱為“窺孔”&#xff09;來識別并提供更高效的代碼替代方案。 1. 基本概念 定義&#xff1a;窺孔優…

如何在CSS中水平居中一個元素?

聚沙成塔每天進步一點點 ? 專欄簡介? 使用 margin: 0 auto? 使用 Flexbox 布局? 使用絕對定位和負邊距? 使用表格布局? 使用網格布局? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅…

Vue組件的邊界情況

01.$root&#xff1b; 訪問組件的根實例&#xff1b;用的不多&#xff0c;基本上在vuex上進行數據操作&#xff1b; 02.$parent/$children; 可以獲得父組件或者子組件上邊的數據&#xff1b;一般不建議使用$parent,因為如果獲取這個值進行修改的話&#xff0c;也會更改父組件上…