數據結構:力扣OJ題(每日一練)

目錄

題一:環形鏈表

思路一:

題二:復制帶隨機指針的鏈表

?思路一:

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


題一:環形鏈表

給定一個鏈表的頭節點 ?head?,返回鏈表開始入環的第一個節點。?如果鏈表無環,則返回?null

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

不允許修改?鏈表。

示例 1:

思路一:

? ? ? ? 定義快慢指針:slow,fast,slow每次走一步,fast每次走兩步;假設到環口長度為L,環的周長為C,slow從環口到相遇點為S,如下圖:slow走了:L+S fast走了:2*(L+S);當slow到環口時fast已經走了n圈到相遇時n>=1,所以fast到相遇時走了:L+n*C+S
得出運算式:L = n*C-S結論:一個指針從起點走,一個從相遇點走,他們會在入口點相遇。

struct ListNode *detectCycle(struct ListNode *head) 
{struct ListNode* slow = head;struct ListNode* fast = head;struct ListNode* newnode = head;//判斷有沒有相遇點while(fast && fast->next){slow = slow->next;fast = fast->next->next;//找到相遇點if(slow == fast){struct ListNode* node = slow;//分別從起點和相遇點開始走while(node != newnode){newnode = newnode->next;node = node->next;}return newnode;}}return NULL;
}

題二:復制帶隨機指針的鏈表

給你一個長度為?n?的鏈表,每個節點包含一個額外增加的隨機指針?random?,該指針可以指向鏈表中的任何節點或空節點。

構造這個鏈表的?深拷貝。?深拷貝應該正好由?n?個?全新?節點組成,其中每個新節點的值都設為其對應的原節點的值。新節點的?next?指針和?random?指針也都應指向復制鏈表中的新節點,并使原鏈表和復制鏈表中的這些指針能夠表示相同的鏈表狀態。復制鏈表中的指針都不應指向原鏈表中的節點?

例如,如果原鏈表中有?X?和?Y?兩個節點,其中?X.random --> Y?。那么在復制鏈表中對應的兩個節點?x?和?y?,同樣有?x.random --> y?。

返回復制鏈表的頭節點。

示例 1:

輸入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
輸出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

?思路一:

第一步:在原鏈表的每一個之間開辟一塊相同空間的copy將val和下一個的地址復制,并改變cur->next=copy;

第二步:因為每個原鏈表后面都有一個復制的copy鏈表所以copy-> randon都可以指向自己復制的randon核心: copy=cur-> randon->next

第三步:將copy鏈表從原鏈表head上分離出來,并將各自的節點接上

?

?

struct Node* copyRandomList(struct Node* head) {struct Node* cur = head;while(cur){struct Node* next = cur->next;//開辟copy的節點struct Node* copy = (struct Node*)malloc(sizeof(struct Node));//復制值copy->val = cur->val;//插入copy->next = next;cur->next = copy;//向后走cur = next;}cur = head;while(cur){struct Node* copy = cur->next;if(cur->random != NULL){//copy的隨機節點指向自己的隨機節點copy->random = cur->random->next;}else{copy->random = NULL;}cur = copy->next;}//分離鏈表struct Node* copyhead = NULL;struct Node* copytail = NULL;cur = head;while(cur){struct Node* copy = cur->next;struct Node* next = copy->next;//分離copy鏈表if(copytail == NULL){copyhead = copytail = copy;}else{copytail->next = copy;copytail = copytail->next;}//恢復原鏈表cur->next = next;cur = next;}return copyhead;
}

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

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

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

相關文章

IDEA如何調試Stream API

Stream API現在在實際開發中應用非常廣泛,經常會遇到需要調試Stream API的場景,這篇文章主要講解如何使用IDEA調試Stream Testpublic void test(){Stream.of(10, 20, 30, 40, 50).mapToInt(e->e*10).filter(e->e>200).forEach(System.out::pri…

使用css實現時間線布局(TimeLine)

前言 在使用uni-app開發微信小程序過程中,遇到了時間軸布局,由于每項的內容高度不一致,使用uniapp自帶的擴展組件uni-steps,樣式布局無法對齊豎線,于是自己造輪子,完成特殊的布局。顯示效果如下&#xff1…

linux shell變量

linux shell變量 1、變量命名規則2、只讀變量3、刪除變量 1、變量命名規則 變量名不能加$命名只能使用英文字母、數字和下劃線,首個字母不能以數字開頭中間不能有空格。可以有下劃線不能使用標點符號不能使用bash中的關鍵字 username"tom"引用 $userna…

WebDAV之π-Disk·派盤+Commander One

Commander one是一款為Mac用戶設計的雙窗格文件管理器,Commander One專業版在原先的版本功能擁有較大的提升。Commander One PRO可以幫助大家將文件從一個地方復制到另一個地方,支持多標簽瀏覽、搜索、自定義熱鍵設置、顯示隱藏文件等功能。 π-Disk派盤 – 知識管理專家 派…

(一)創建型設計模式:4、原型模式(Prototype Pattern)

目錄 1、原型模式的含義 2、C實現原型模式的簡單實例 1、原型模式的含義 通過復制現有對象來創建新對象,而無需依賴于顯式的構造函數或工廠方法,同時又能保證性能。 The prototype pattern is a creational design pattern in software development. …

【校招VIP】java語言考點之Map1.7和1.8

考點介紹: HashMap是大中小廠面試的高頻考點,主要從底層結構,和線程安全等角度來進行考察,考察點比較集中,但是有一定難度。 分為初級和高級兩種:初級一般集中在中小公司的map的key-value的可重復和可空問題…

Server - WandB 統計運行 Epoch 以及 手動上傳日志

歡迎關注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132227253 WandB (Weights & Biases) 是在線的模型訓練可視化工具,可以幫助跟蹤機器學習項目,記錄運行中的超參數和輸…

linux shell快速入門

linux shell快速入門 0 、前置1、簡單使用 0 、前置 一安裝linux的虛擬環境 1、簡單使用 1、新建/usr/shell目錄 2、新建hello.sh 文件 3、編寫腳本文件# !/bin/bashecho "hello world"查看是否具備執行權限 新增執行權限 chomd x hello.sh執行hello.sh文件 /b…

限制編輯下的PDF可以轉換其他格式嗎?這2個方法可行

我們知道,PDF可以通過設置“限制編輯”來保護文件不被隨意更改,那PDF設置了“限制編輯”還可以轉換其他格式嗎? 如果PDF設置的是禁止任何更改的“限制編輯”,那PDF菜單【轉換】界面下的格式選項就會呈現灰色狀態,無法…

vscode的配置和使用

1.側邊欄調整大小 放大:View -> Appearance -> Zoom in(快捷鍵Ctrl ) 縮小:View -> Appearance -> Zoom out(快捷鍵Ctrl -) 側邊欄字體調整到合適大小后,可以按下一步調整代碼區…

【java】Java與SQLite3數據庫類型之間對應關系

引 在開發應用程序時,經常需要將數據存儲到數據庫中。SQLite3 是一種輕量級的嵌入式數據庫,廣泛應用于移動設備和嵌入式系統。在使用 SQLite3 數據庫時,了解 Java 數據類型與 SQLite3 數據庫類型之間的對應關系非常重要,以便正確…

一盞茶的時間,帶你輕松上手Pinia

🎬 岸邊的風:個人主頁 🔥 個人專欄 :《 VUE 》 《 javaScript 》 ?? 生活的理想,就是為了理想的生活 ! 目錄 📚 前言 📘 創建 Pinia 📘 Option Store 📘 Pinia 提供多種選項配…

k8s pod啟動報錯: no route to host

k8s pod kuboard啟動報錯 查看pod命令 kubectl get pods -A kubectl get pods --all-namespaces查看報錯pod日志 命令: kubectl logs -f -n namespace nametime"2023-08-09T13:40:3608:00" levelerror msg"不能獲取 AgentEndpointsGet \"http:/…

在 Linux 中使用 systemd 注冊服務

Systemd 是一種現代的 Linux 系統初始化系統和服務管理器。它旨在管理系統服務的初始化、配置和控制。Systemd 的一個關鍵特性是它可以管理服務,這些服務是為系統提供特定功能的后臺進程。在本指南中,我們將探討如何使用 systemd 在 Linux 中注冊服務。 …

【算法基礎20-單調棧】

算法原理: 用單調遞增棧,當該元素可以入棧的時候,棧頂元素就是它左側第一個比它小的元素。 以:3 4 2 7 5 為例,過程如下: 動態模擬過程 題目: 給定一個長度為 N 的整數數列,輸出每個數左邊第一…

Linux 基礎(九)軟件包管理

軟件包管理 概念軟件包管理工具Red Hat 系RPMrpm安裝rpm卸載 YUM(推薦)源倉庫管理常見國內 yum 源更換源(非必須,除非下載速度確實過慢) YUM管理軟件 Debian 系源倉庫管理常見國內 apt 源更換源(非必須&…

postman入門基礎 —— 接口測試流程

一、編寫接口測試計劃 接口測試計劃和功能測試計劃目標一致,都是為了確認需求、確定測試環境、確定測試方法,為設計測試用例做準備,初步制定接口測試進度方案。一般來說,接口測試計劃包括概述、測試資源、測試功能、測試重點、測試…

Flutter 報錯 Could not create task ‘xxx‘.this and base files have different roots

遇到此問題也是先去百度了,有的說改了Gradle版本、gradle-wrapper.properties版本和ext.kotlin_version版本之后解決的,我沒嘗試,我用蹩腳的英語大致讀了一下就不是這樣說的,況且我用有道翻譯了也不是這個意思啊,我不知…

抖音小程序實現less語言編譯樣式

1.在抖音開發工具中搜索擴展less 2. 然后點擊小齒輪選擇擴展設置 3. 然后在擴展設置中選擇在settings.json中編輯# 4. 在settings.json中加入以下這段代碼即可 // Easy LESS配置"less.compile": {"compress": false,//是否壓縮"sourceMap": fal…

前端性能優化:緩存

在快節奏的互聯網時代,網站的加載速度直接影響用戶體驗和業務成功。而緩存作為性能優化的重要手段,可以大幅提升網頁加載速度,減少服務器負擔。本文將為你詳解緩存的使用,幫助你優化前端性能,為用戶呈現更快速、流暢的…