国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結構(四)】鏈表經(jīng)典練習題

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結構(四)】鏈表經(jīng)典練習題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?博主主頁: 33的博客?
??文章專欄分類:數(shù)據(jù)結構??
??我的代碼倉庫: 33的代碼倉庫??
??????關注我?guī)銓W更多數(shù)據(jù)結構知識

【數(shù)據(jù)結構(四)】鏈表經(jīng)典練習題,數(shù)據(jù)結構,數(shù)據(jù)結構,鏈表,windows,循環(huán)鏈表,中間節(jié)點,回文鏈表

1.前言

在上一篇文章中博主已經(jīng)介紹了鏈表的基礎知識,什么是鏈表,如何實現(xiàn)一個鏈表,以及LinkedList的操作方法,那么在這篇文章中通過一些鏈表的經(jīng)典習題來練習吧。

2.刪除值為key的所有結點

刪除值為val的所有結點:OJ鏈接
解題思路:

1.遍歷鏈表。
2.如果某個結點A的值等于key,那么A的前一個結點B的next值直接等于A的next。
3,繼續(xù)遍歷,遇到等于值等于key的重復上訴操作,直到全部遍歷完成。

public void removeAllKey(int key) {
    if (head==null){
        return;
    }
    Node node=head;
    Node cur=head.next;
    while (cur!=null){
        if(cur.val==key){
            node.next=cur.next;
            cur=cur.next;
        }else {
            node=node.next;
            cur=cur.next;
        }
    }
    if(head.val==key){
        head=head.next;
    }
    }

3.反轉鏈表

反轉鏈表:OJ鏈接

public ListNode reverseList(ListNode head) {
        if(head==null||head.next==null){
            return head;
        }
        ListNode cur=head.next;
        head.next=null;
        while (cur!=null){
            ListNode curNext=cur.next;
            cur.next=head;
            head=cur;
            cur=curNext;
        }
        return head;
    }

4.返回中間結點

返回中間結點:OJ鏈接
方式一:
解題思路:

1.求鏈表的大小size
2.中間結點為size/2
遍歷鏈表,走到size/2的位置,返回該節(jié)點

class Solution {
	//求鏈表長度
    public int size(ListNode head) {
        ListNode node=head;
        int count=0;
        while (node!=null){
           count++;
            node=node.next;
        }
        return count;
    }
    public ListNode middleNode(ListNode  head) {
        if(head==null||head.next==null){
            return head;
        }
        int Size=size(head);
        int middle=Size/2;
        ListNode node=head;
        for (int i=0;i<middle;i++){
            node=node.next;
        }
        return node;
    }    
}

方式二:
解題思路:

1.設置一個快結點:fast,設置一個慢結點:slow。
2.我們試想:如果fast的速度是slow的兩倍,那么當fast到達路程的終點時,此時slow就走了路程的一半。
3.所以我們讓fast每次走兩步,slow每次走一步,當fast=null或者fast.next=null的時候,slow就是中間結點

public Node middleNode2() {
        Node fast=head;
        Node slow=head;
        while (fast!=null||fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
        }
        return slow;
    }

5.輸出倒數(shù)第k個結點

輸入一個鏈表,輸出該鏈表中倒數(shù)第k個結點:OJ鏈接
解題思路:

1。讓fast先走k-1步數(shù)
2.再同時走,當fast到達終點時,那么它們就相差k
3.此時的slow就是倒數(shù)第k個結點

ublic Node FindKthToTail (int k) {
        Node fast=head;
        Node slow=head;
    if(k<=0||head==null){
        return null;
    }
    while (k-1>0){
        fast=fast.next;
        k--;
    }
    while (fast.next!=null){
        fast=fast.next;
        slow=slow.next;
    }
    return slow;
    }

6.鏈表分割

以給定值x為基準將鏈表分割成兩部分,所有小于x的結點排在大于或等于x的結點之前:OJ鏈接
解題思路:

1.首先,遍歷鏈表
2.再創(chuàng)建兩個鏈表,一個用于存放小于x的值,另一個用于存放大于x的值
3.再把第一個鏈表的最后一個結點與第二個鏈表的頭節(jié)點串起來。

public Node partition(int x) {
        if (head==null){
            return null;
        }
        Node as=null;
        Node ae=null;
        Node bs=null;
        Node be=null;
        Node cur=head;
        while (cur!=null){
            if (cur.val<x){
              if(as==null){
                  //插入第一個節(jié)點
                  as=cur;
                  ae=cur;
                  cur=cur.next;
              } else {
                  ae.next=cur;
                  ae=ae.next;
                  cur=cur.next;
              }
            }else {
             //cur.val>x
             if(bs==null){
             //插入第一個節(jié)點
                 bs=cur;
                 be=cur;
                 cur=cur.next;
             }  else {
                 be.next=cur;
                 be=be.next;
                 cur=cur.next;
             }
            }
        }
        //如果第一個鏈表為空就直接返回第二個鏈表的頭節(jié)點
        if(as==null){
            return bs;
        }
        ae.next=bs;
        if(bs != null) {
            //第2個區(qū)間有數(shù)據(jù)
            be.next = null;
        }
        head=as;
        return head;
    }

7.鏈表回文

給定一個鏈表的頭指針A,請返回一個bool值,代表其是否為回文結構:OJ鏈接
解題思路:

1.查看鏈表是否回文,是指從前向后遍歷,或者從后向前遍歷,輸出的之都相同。
2.我們可以先找到中間位置,再從中間位置進行翻轉,使它同時從兩頭向中間遍歷
3.遍歷的時候如果如果鏈表有偶數(shù)個的情況,和有奇數(shù)個的情況是不一樣的,當有奇數(shù)個時,走到相同的位置就停止,當有偶數(shù)個時,當下再走一步就相遇時就停止。

public boolean chkPalindrome() {
		 if(head == null || head.next == null) {
            return true;
        }
        //按照中間位置翻轉鏈表
        //1.找到中間位置(middle已經(jīng)在4中寫過)
        Node middle=middleNode2();
        //2.翻轉
        Node ehead=middle;
        Node cur=ehead.next;
        while (cur!=null){
            Node curNext=cur.next;
            cur.next=ehead;
            ehead=cur;
            cur=curNext;
        }
        //從兩頭開始遍歷
        Node snode=head;
        Node enode=ehead;
        while (snode!=enode){
            if (snode.val!=enode.val){
                return false;
            }
            if (snode.next==enode){
                return true;
            }
                snode=snode.next;
                enode=enode.next;
        }
        return true;
    }

8.相交鏈表

給你兩個單鏈表的頭節(jié)點 headA 和 headB ,請你找出并返回兩個單鏈表相交的起始節(jié)點:OJ鏈接
解題思路:

1.求兩個鏈表的長度,再求長度差值
2.定義節(jié)點fast代表長的鏈表頭節(jié)點,slow代表短的鏈表的頭節(jié)點。先讓長的鏈表先走差值步,再同時走。
3.兩個鏈表相遇時就是相交節(jié)點。

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {        
        ListNode nodeA=headA;
        ListNode nodeB=headB;
        int lenA=size(headA);
        int lenB=size(headB);
        ListNode fast=headA;
        ListNode slow=headB;
        int len=lenA-lenB;
        if(len<0){
            len=lenB-lenA;
            fast=headB;
            slow=headA;
        }
        while(len>0){
            fast=fast.next;
            len--;
        }
        while(fast!=slow&&fast!=null){
            fast=fast.next;
            slow=slow.next;
        }       
        return fast;      
    }

9.環(huán)形鏈表

9.1是否為環(huán)形鏈表

給你一個鏈表的頭節(jié)點 head ,判斷鏈表中是否有環(huán):OJ鏈接
解題思路:

1.定義節(jié)點fast代表長的鏈表頭節(jié)點,slow代表短的鏈表的頭節(jié)點.
2.每次讓fast走兩步,slow走一步,如果是環(huán)形鏈表,那么它們一定會在環(huán)中的某一個位置相遇,否則不是環(huán)形鏈表
為什么每次讓fast走兩步,slow走一步?不可以fast走3步,4步嗎?假設環(huán)中只有兩個元素A,B,當slow進入環(huán)時在A的節(jié)點的位置,此時fast在B節(jié)點的位置,slow走一步就到B的位置,fast走3步就到A的位置,那么它們永遠都不會相遇。
只有每次讓fast走兩步,slow走一步,換的長度為1,那么肯定會相遇。

 public boolean hasCycle(ListNode head) {
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null&&fast.next!=null){
            //fast.next!=null&&fast!=null,不能這樣寫
            fast=fast.next.next;
            slow=slow.next;
            if(fast==slow){
                return true;
            }   
        }
        return false;       
    }

9.2入環(huán)第一個節(jié)點

給定一個鏈表的頭節(jié)點 head ,返回鏈表開始入環(huán)的第一個節(jié)點。 如果鏈表無環(huán),則返回 null:OJ鏈接
解題思路:

讓一個指針從鏈表起始位置開始遍歷鏈表,同時讓一個指針從判環(huán)時相遇點的位置開始繞環(huán)運行,兩個指針都是每次均走一步,最終肯定會在入口點的位置相遇。
證明如下:

【數(shù)據(jù)結構(四)】鏈表經(jīng)典練習題,數(shù)據(jù)結構,數(shù)據(jù)結構,鏈表,windows,循環(huán)鏈表,中間節(jié)點,回文鏈表

public class Solution {
    ListNode hasCycle(ListNode head) {
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null&&fast.next!=null){
            //fast.next!=null&&fast!=null,不能這樣寫
            fast=fast.next.next;
            slow=slow.next;
            if(fast==slow){
                return fast;
            }   
        }
        return null;       
    }
    public ListNode detectCycle(ListNode head) {
          ListNode fast=hasCycle(head);
          if(fast==null){
            return null;
          }
          ListNode slow=head;
          while(fast!=slow){
            fast=fast.next;
            slow=slow.next;
          }
          return fast;  
    }
}

10.總結

本篇博客主要對鏈表的經(jīng)典習題進行了講解,同學們要理解解題的一些思想做到融會貫通,如果有疑惑的地方歡迎大家來和博主溝通,交流。

下期預告:棧文章來源地址http://www.zghlxwxcb.cn/news/detail-855233.html

到了這里,關于【數(shù)據(jù)結構(四)】鏈表經(jīng)典練習題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 力扣(LeetCode)數(shù)據(jù)結構練習題(2)

    力扣(LeetCode)數(shù)據(jù)結構練習題(2)

    今天又寫了兩道關于鏈表的練習題,來給大家分享一下。鞏固一下上一篇學到的鏈表知識,題目可以然我們更清楚的認識鏈表。 目錄 給你單鏈表的頭節(jié)點?head?,請你反轉鏈表,并返回反轉后的鏈表 給你單鏈表的頭結點?head?,請你找出并返回鏈表的中間結點。如果有兩個中

    2024年02月21日
    瀏覽(27)
  • 【數(shù)據(jù)結構】“單鏈表”的練習題(二)

    【數(shù)據(jù)結構】“單鏈表”的練習題(二)

    ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???? ?? ?? ?? 個人主頁 :阿然成長日記 ??點擊可跳轉 ?? 個人專欄: ??數(shù)據(jù)結構與算法??C語言進階 ?? 不能則學,不知則問,恥于問人,決無長進 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 前言: 最近在刷題的

    2024年02月13日
    瀏覽(28)
  • 【數(shù)據(jù)結構】“單鏈表”的練習題(一)

    【數(shù)據(jù)結構】“單鏈表”的練習題(一)

    ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???? ?? ?? ?? 個人主頁 :阿然成長日記 ??點擊可跳轉 ?? 個人專欄: ??數(shù)據(jù)結構與算法??C語言進階 ?? 不能則學,不知則問,恥于問人,決無長進 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 題目要求: 給你單鏈

    2024年02月12日
    瀏覽(30)
  • 數(shù)據(jù)結構與算法系列之習題練習

    數(shù)據(jù)結構與算法系列之習題練習

    ?? ?? 博客:小怡同學 ?? ?? 個人簡介:編程小萌新 ?? ?? 如果博客對大家有用的話,請點贊關注再收藏 ?? 括號匹配問題。 用隊列實現(xiàn)棧。 用棧實現(xiàn)隊列。 設計循環(huán)隊列。 有效的括號 //用棧來實現(xiàn) //左括號進棧 右括號出棧并銷毀如果不匹配則return //設置兩個隊列,入棧

    2024年02月11日
    瀏覽(26)
  • 數(shù)據(jù)結構與算法--圖(概念+練習題+解析)

    數(shù)據(jù)結構與算法--圖(概念+練習題+解析)

    有向圖 在有向圖中有以下幾點結論: 1.所有頂點的度數(shù)之和等于邊數(shù)的二倍。 2.所有頂點的入度之和等于出度之和。 3.n個頂點的有向完全圖有n(n-1)條邊。 4.n個頂點的強連通圖至少有n條邊。 無向圖 在無向圖中有以下幾點結論: 1.所有頂點的度數(shù)之和等于邊數(shù)的二倍。 2.n個頂

    2024年02月04日
    瀏覽(22)
  • 【數(shù)據(jù)結構】時間復雜度---OJ練習題

    【數(shù)據(jù)結構】時間復雜度---OJ練習題

    目錄 ??時間復雜度練習 ??面試題---消失的數(shù)字 題目描述 題目鏈接:面試題 17.04. 消失的數(shù)字 ??解題思路 ??思路1: malloc函數(shù)用法? ??思路2: ??思路3: ???如果有不了解時間復雜度的請移步上一篇文章:【數(shù)據(jù)結構】初識 題目描述 數(shù)組 nums 包含從 0 到 n 的所有整數(shù),

    2024年02月16日
    瀏覽(24)
  • 【數(shù)據(jù)結構】順序表詳解(附leetcode練習題)

    【數(shù)據(jù)結構】順序表詳解(附leetcode練習題)

    ??個人主頁:fighting小澤 ??作者簡介:目前正在學習C語言和數(shù)據(jù)結構 ??博客專欄:數(shù)據(jù)結構 ???歡迎關注:評論????點贊????留言???? 線性表(linear list)是n個具有相同特性的數(shù)據(jù)元素的有限序列。 線性表是一種在實際中廣泛使用的數(shù)據(jù)結構,常見的線性表:順

    2023年04月27日
    瀏覽(23)
  • 【數(shù)據(jù)結構】算法的時間復雜度和空間復雜度(下)(附leetcode練習題)

    【數(shù)據(jù)結構】算法的時間復雜度和空間復雜度(下)(附leetcode練習題)

    ??個人主頁:fighting小澤 ??作者簡介:目前正在學習C語言和數(shù)據(jù)結構 ??博客專欄:數(shù)據(jù)結構 ???歡迎關注:評論????點贊????留言???? 空間復雜度也是一個數(shù)學表達式,是對一個算法在運行過程中 臨時占用的額外的存儲空間大小的量度 。 空間復雜度不是程序占用

    2023年04月19日
    瀏覽(21)
  • 【數(shù)據(jù)結構】 算法的時間復雜度和空間復雜度 (上)(附leetcode練習題)

    【數(shù)據(jù)結構】 算法的時間復雜度和空間復雜度 (上)(附leetcode練習題)

    ??個人主頁:fighting小澤 ??作者簡介:目前正在學習C語言和數(shù)據(jù)結構 ??博客專欄:數(shù)據(jù)結構 ???歡迎關注:評論????點贊????留言???? 如何衡量一個算法的好壞呢?比如對于以下斐波那契數(shù)列: 斐波那契數(shù)列的遞歸實現(xiàn)方式非常簡潔,但簡潔一定好嗎?那該如何

    2023年04月14日
    瀏覽(26)
  • 【數(shù)據(jù)結構】算法的時間復雜度和空間復雜度 (上)(附leetcode練習題)

    【數(shù)據(jù)結構】算法的時間復雜度和空間復雜度 (上)(附leetcode練習題)

    ??個人主頁:fighting小澤 ??作者簡介:目前正在學習C語言和數(shù)據(jù)結構 ??博客專欄:數(shù)據(jù)結構 ???歡迎關注:評論????點贊????留言???? 如何衡量一個算法的好壞呢?比如對于以下斐波那契數(shù)列: 斐波那契數(shù)列的遞歸實現(xiàn)方式非常簡潔,但簡潔一定好嗎?那該如何

    2023年04月22日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包