鏈表常見OJ題

目錄

題目一:移除鏈表元素

(1)題目鏈接

(2)題目要求

(3)題解

題目二:反轉鏈表

(1)題目鏈接

(2)題目要求?編輯

(3)題解

題目三:鏈表的中間節點

(1)題目鏈接

(2)題目要求

題目四:返回倒數第k個節點

(1)題目鏈接

?(2)題目要求

(3)題解

題目五:合并兩個有序鏈表

(1)題目鏈接

?(2)題目要求

(3)題解


題目一:移除鏈表元素

(1)題目鏈接

移除鏈表元素icon-default.png?t=N7T8https://leetcode.cn/problems/remove-linked-list-elements/description/

(2)題目要求

(3)題解

操作:

  1. cur代表當前需要刪除的節點

    prev代表當前需要刪除節點cur的前驅節點

  2. 如果找到需要刪除的節點,prev.next = cur.next;cur = cur.next;

  3. 如果沒找到所要刪除的節點,移動prev節點prev = cur;再移動cur判斷下一個節點cur = cur.next;

  4. 最后的效果

  5. 如何處理頭節點就是要刪除的節點的情況?
    先將頭節點以外的刪除再來考慮頭節點位置即可
    if(head.val == val) {
    ? ? ? ? ? ? head = head.next;
    ? ? ? ? }
    也可先考慮頭節點的情況,while循環判斷
    ?

public void removeAllKey(int val) {//1. 判空if (head == null) {head = head.next;}//2. 定義prev 和 curListNode prev = head;ListNode cur = head.next;//3.開始判斷并且刪除while (cur != null) {if (cur.val == val) {//找到了prev.next = cur.next;} else {prev = cur;}cur = cur.next;}//4.處理頭節點if(head.val == val) {head = head.next;}}
public ListNode removeElements(ListNode head, int val) {  // 1. 處理頭節點  while (head != null && head.val == val) {  head = head.next;  }  // 2. 如果鏈表為空,直接返回  if (head == null) {  return head;  }  ListNode cur = head;  // 3. 開始判斷并且刪除  while (cur.next != null) {  if (cur.next.val == val) {  // 找到了  ListNode del = cur.next;  cur.next = del.next;  } else {  cur = cur.next;  }  }  // 4. 這里不需要再處理頭節點,因為在循環開始前已經處理過了  return head;  }  

題目二:反轉鏈表

(1)題目鏈接

反轉鏈表icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-linked-list/description/

(2)題目要求

(3)題解

思路:

  1. 采用頭插法,將頭節點以外的節點依次插入到頭節點前面并改變next的指向

操作:

  1. 首先我們判斷頭節點head為空的情況,為空時返回head即可
  2. cur節點表示什么?定義一個cur節點表示頭結點的下一個節點,表示我們從頭節點的下一個節點開始進行頭插
  3. curN節點表示什么?curN節點表示記錄cur的下一個節點,當我們頭插一個節點之后為了不丟失下一個結點的地址,我們需要提前記錄下這個節點的地址,以便進行下一次頭插
  4. 在進行一次頭插后我們就改變頭節點head的位置,同時cur向后移動進行下一次頭插
public ListNode reverseList(ListNode head) {if (head == null) {return head;}ListNode cur = head.next;head.next = null;while (cur != null) {ListNode curN = cur.next;cur.next = head;head = cur;cur = curN;}return head;}

題目三:鏈表的中間節點

(1)題目鏈接

鏈表的中間節點icon-default.png?t=N7T8https://leetcode.cn/problems/middle-of-the-linked-list/description/

(2)題目要求

?(3)題解

尋找中間節點用到了非常經典的快慢指針方法

思路:

  1. 使用兩個指針變量,剛開始都位于鏈表的第 1 個結點,一個永遠一次只走 1 步,一個永遠一次只走 2 步,一個在前,一個在后,同時走。這樣當快指針走完的時候,慢指針就來到了鏈表的中間位置。

  2. 這道題換一種說法其實就是簡單的數學問題,有兩個人,fast和slow,fast的速度是2,slow的速度是1,它們從起點同時出發,當fast到達終點時,slow就在路程的中點,而slow所在的位置就是我們要返回的中間節點

操作:

  1. fast和slow在同一起點,也就是head
  2. 循環條件是什么?
    這里我們要考慮到奇數節點和偶數節點的區別
    當鏈表的節點數為偶數時,fast == null時找到中間節點停止循環
    當鏈表的節點數為奇數時,fast.next == null時找到中間節點停止循環

public ListNode middleNode(ListNode head) {ListNode fast = head;ListNode slow = head;while (fast != null && fast.next != null) {ListNode tmp = fast.next;fast = tmp.next;slow = slow.next;}return slow;}

題目四:返回倒數第k個節點

(1)題目鏈接

返回倒數第k個節點icon-default.png?t=N7T8https://leetcode.cn/problems/kth-node-from-end-of-list-lcci/description/

?(2)題目要求

(3)題解

思路:

因為題目要求是返回導數第k個節點,在這里我們依然使用的是快慢指針方法

我們先讓fast走k步,來抵消倒數的這個差值,然后再讓fast和slow同時走

操作:

  1. fast和slow從同一起點head出發
  2. 先將fast走k步再讓它們同時走,直到fast為空時返回slow即可
    public int kthToLast(ListNode head, int k) {ListNode fast = head;ListNode slow = head;for(int i = 0;i < k;i++) {fast = fast.next;}while(fast != null) {fast = fast.next;slow = slow.next;}return slow.val;}

題目五:合并兩個有序鏈表

(1)題目鏈接

合并兩個有序鏈表icon-default.png?t=N7T8https://leetcode.cn/problems/merge-two-sorted-lists/description/

?(2)題目要求

(3)題解

思路:

  1. 將兩個鏈表的頭節點依次進行比較,如果headA.val <?headB.val,則tmp.next = headA,讓headA往后走一步,tmp也往后走一步;headA.val >?headB.val同理
  2. 如果A鏈表或B鏈表中有一個提前遍歷完,那么再往后走就指null,這時tmp.next及時接上那個未遍歷完的鏈表節點。

操作:

  1. 創建一個傀儡節點,用來指向兩個鏈表頭節點較小的一個
  2. 循環條件是什么?在兩個鏈表的長度長度不同時,我們需要當一個鏈表判斷完時接上另一個鏈表,這時我們要確保短的鏈表每個節點的val都判斷到,也就是兩個鏈表的不能為null,也就是headA != null && headB != null
  3. 要考慮兩個鏈表空的情況,當A為空時直接指向B即可,否則相反
 public ListNode mergeTwoLists(ListNode headA, ListNode headB) {ListNode newH = new ListNode();ListNode tmp = newH;while(headA != null && headB != null) {if(headA.val < headB.val) {tmp.next = headA;headA = headA.next;tmp = tmp.next;} else{tmp.next = headB;headB = headB.next;tmp = tmp.next;}}if(headA != null) {tmp.next = headA;} else {tmp.next = headB;}return newH.next;}

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

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

相關文章

藍橋杯備戰.19有獎問答dfs

P9230 [藍橋杯 2023 省 A] 填空問題 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) #include<bits/stdc.h> using namespace std; #define endl \n //#define int long long const int N 2e510; int a[N],w[N]; int ans 0; void dfs(int score,int cnt) {if(cnt>3…

項目9-網頁聊天室1(注冊+Bycrpt加密)

1.準備工作 1.1.前端頁面展示 1.2 數據庫的建立 我們通過注冊頁面&#xff0c;考慮如何設計用戶表數據庫。 用戶id&#xff0c;userId用戶名&#xff0c;唯一&#xff0c;username用戶密碼&#xff0c;password&#xff08;包括密碼和確認密碼ensurePssword【數據庫沒有該字段…

【簡單介紹下Milvus】

&#x1f308;個人主頁: 程序員不想敲代碼啊 &#x1f3c6;CSDN優質創作者&#xff0c;CSDN實力新星&#xff0c;CSDN博客專家 &#x1f44d;點贊?評論?收藏 &#x1f91d;希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出指正&#xff0c;讓我們共…

網絡3--網絡通信的深度理解(端口號)

網絡通信的進一步理解 兩個主機間進行通信&#xff0c;其實是兩個主機間的軟件進行通信&#xff0c;軟件也就是可執行程序&#xff0c;運行時就是進程&#xff0c;所以也為進程間通信。 進程間通信需要共享資源&#xff0c;這里兩個主機間的共享資源是網絡&#xff0c;利用的是…

Visual Studio生成C++的DLL文件(最簡單版)

前言 當你在使用C編寫一些可重用的代碼時&#xff0c;將其打包成一個動態鏈接庫&#xff08;DLL&#xff09;可以使其更容易地被其他項目或者程序調用和使用。Visual Studio提供了一種簡單的方式來生成C的DLL文件。下面是一個關于如何在Visual Studio中生成C的DLL文件的簡單教…

【 第一性原理計算方法及應用】

第一性原理計算方法及應用述

對接極速行情丨DolphinDB MDL 行情插件使用指南

通聯數據依托于金融大數據&#xff0c;結合人工智能技術為投資者提供個性化、智能化、專業化投資服務&#xff0c; MDL 則是通聯數據提供的高頻行情數據服務。DolphinDB 提供了能夠從 MDL 服務器獲取高頻行情數據的 DolphinDB MDL 插件&#xff0c;幫助用戶方便地通過 DolphinD…

算法day06

第一題 1658. 將 x 減到 0 的最小操作數 如題上述&#xff1a; 本題原來的意思給定一個數字x&#xff0c;從數組的左邊或者右邊 使用x減去數組中的數字&#xff0c;直到減去最后一個數字為0時&#xff0c;返回最小的操作次數&#xff1b;如果最終減去的數組中的數字之后不能得…

HR系統組合漏洞挖掘過程

前言 某天在項目中遇到了一個奇怪的人才管理系統&#xff0c;通過FOFA&#xff08;會員可在社區獲取&#xff09;進行了一番搜索&#xff0c;發現了該系統在互聯網上的使用情況相當廣泛。于是&#xff0c;我開始了后續的審計過程。 在搜索過程中&#xff0c;我偶然間找到了一份…

「TypeScript系列」TypeScript 基礎類型

文章目錄 一、TypeScript 基礎類型1. **Number**: 用于表示數字。可以是整數或浮點數。2. **String**: 用于表示文本類型的數據。3. **Boolean**: 表示邏輯值&#xff1a;true 或 false。4. **Array**: 表示一組值。TypeScript 使用泛型&#xff08;generics&#xff09;來定義…

Mysql存儲引擎對比

存儲引擎InnoDBMyISAM文件存儲結構.frm文件&#xff1a;存放表結構的定義信息 .ibd文件或.ibdata文件&#xff1a;存放InnoDB數據&#xff08;數據和索引&#xff09;【獨享表空間】每個表一個.ibd文件【共享表空間】所有表使用一個.ibdata文件- .frm文件&#xff1a;存放表結構…

Nginx靜態壓縮和代碼壓縮,提高訪問速度!

一、概述 基于目前大部分的應用&#xff0c;都使用了前后端分離的框架&#xff0c;vue的前端應用&#xff0c;也是十分的流行。不知道大家有沒有遇到這樣的問題&#xff1a; 隨著前端框架的頁面&#xff0c;功能開發不斷的迭代&#xff1b;安裝的依賴&#xff0c;不斷的增多&a…

機器學習【簡述】

什么是機器學習 機器學習研究的是計算機怎么模擬人類的學習行為&#xff0c;以獲取的知識或技能&#xff0c;并重新組織已有的知識結構使之不斷改善自身。簡單一點說&#xff0c;就是計算機從數據中學習初規律和模式&#xff0c;以應用在新數據上做預測的任務。近年來互聯網數…

無人機的用途

無人機&#xff0c;即無人駕駛飛機&#xff0c;其用途廣泛且多樣&#xff0c;涉及到多個領域。 在農業領域&#xff0c;無人機通過搭載各種傳感器和相機&#xff0c;可以對農田進行空中巡視&#xff0c;收集農田數據&#xff0c;如土壤含水量、氣溫、濕度等&#xff0c;以及植…

詳細的性能分析和調優的示例過程:

當面臨數據庫查詢性能下降的問題時&#xff0c;以下是一個詳細的性能分析和調優的示例過程&#xff1a; ### 1. 監控和識別問題 假設你負責維護一個電子商務網站數據庫&#xff0c;最近用戶反映搜索功能響應慢。你立即使用數據庫監控工具&#xff08;如Prometheus、Grafana&am…

Ardupilot開源飛控工程項目編譯回顧

Ardupilot開源飛控工程項目編譯回顧 1. 源由2. 工程編譯3. 命令列表3.1 工作環境設置3.2 獲取工程代碼3.3 建立編譯環境3.4 編譯工程代碼3.5 保存編譯結果3.6 清理編譯結果3.7 編譯設備目標 4. 補充 1. 源由 最近&#xff0c;有點莫名的連續遇到了2次Ardupilot編譯報錯。百思不…

Quartz.Net(2)——NetCore3.1整合Quartz.Net

在上篇文章中Quartz.Net(1) 已經介紹了Quartz.Net的基本運用&#xff0c;該篇文章中將主要介紹NetCore3.1如何整合Quartz.Net&#xff0c;在后臺運行定時job&#xff0c;并運用到上篇文章講到的介紹點。 1 導入Nuget包 <PackageReference Include"Quartz" Versio…

PyTorch中的torch.cuda.amp.autocast

torch.cuda.amp.autocast的使用 torch.cuda.amp.autocast是PyTorch中一種自動混合精度計算的方法&#xff0c;它允許在深度學習模型的訓練過程中自動執行混合精度計算&#xff0c;從而加快訓練速度并減少顯存占用。 在使用torch.cuda.amp.autocast時&#xff0c;一般會將模型…

Ubuntu系統如何使用寶塔面板搭建HYBBS論壇并發布公網遠程訪問

文章目錄 前言1. HYBBS網站搭建1.1 HYBBS網站安裝1.2 HYBBS網站測試1.3. cpolar的安裝和注冊 2. 本地網頁發布2.1.Cpolar臨時數據隧道2.2.Cpolar穩定隧道&#xff08;云端設置&#xff09;2.3.Cpolar穩定隧道&#xff08;本地設置&#xff09; 3.公網訪問測試總結 前言 在國內…

【智能算法】河馬優化算法(HO)原理及實現

目錄 1.背景2.算法原理2.1算法思想2.2算法過程 3.結果展示4.參考文獻5.代碼獲取 1.背景 2024年&#xff0c;MH Amiri受到自然界河馬社會行為啟發&#xff0c;提出了河馬優化算法&#xff08;Hippopotamus Optimization Algorithm, HO&#xff09;。 2.算法原理 2.1算法思想 …