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

詳解鏈表oJ<反轉鏈表,鏈表的中間節(jié)點及鏈表的回文>

這篇具有很好參考價值的文章主要介紹了詳解鏈表oJ<反轉鏈表,鏈表的中間節(jié)點及鏈表的回文>。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

詳解鏈表oJ<反轉鏈表,鏈表的中間節(jié)點及鏈表的回文>,鏈表,數(shù)據(jù)結構

hello,大家好,這里是Dark FlameMaster,今天和大家分享的是有關數(shù)據(jù)結構鏈表的幾道題目,鏈表的中間節(jié)點,反轉鏈表及判斷鏈表是否為回文結構,放在一起講解會印象更加深刻。

一,鏈表的中間節(jié)點

  1. 鏈接:鏈表的中間節(jié)點

詳解鏈表oJ<反轉鏈表,鏈表的中間節(jié)點及鏈表的回文>,鏈表,數(shù)據(jù)結構

詳解鏈表oJ<反轉鏈表,鏈表的中間節(jié)點及鏈表的回文>,鏈表,數(shù)據(jù)結構

分析:
?如果想要得到鏈表的中間節(jié)點,最簡單的思路就是從頭結點遍歷整個鏈表,就可以知道鏈表的長度,假設為num個,要求是如果為偶數(shù)個數(shù),返回第二個節(jié)點。得到個數(shù)后要創(chuàng)建新的節(jié)點,往后走num/2個位置。如果num為奇數(shù),如5,往后next兩步,如果是偶數(shù)如6,往后next3步,皆滿足要求。
實現(xiàn):

struct ListNode* middleNode(struct ListNode* head){
    struct ListNode* ret = head;
    int len = 0;
    int k = 0;
    while(ret)
    {
        ret = ret -> next;
        len++;
    }
    ret = head;
    while(k < len / 2)
    {
        k++;
        ret = ret -> next;
    }
    return ret;
}

此題還有一種雙指針的方法
思路:
?設置快慢指針,快指針一次走兩步,慢指針一次走一步,還是分偶數(shù)和奇數(shù)的情況。
如果是奇數(shù)的話
詳解鏈表oJ<反轉鏈表,鏈表的中間節(jié)點及鏈表的回文>,鏈表,數(shù)據(jù)結構
如果是偶數(shù)的話
詳解鏈表oJ<反轉鏈表,鏈表的中間節(jié)點及鏈表的回文>,鏈表,數(shù)據(jù)結構
要注意觀察fast的最終位置
實現(xiàn)如下

struct ListNode* middleNode(struct ListNode* head) {
	struct ListNode* val = NULL;
	struct ListNode* baga = NULL;
	val = head;
	baga = head;
	while (val->next != NULL && val->next->next != NULL)
	{
		val = val->next->next;
		baga = baga->next;
	}
	if (val->next == NULL)
	{
		return baga;
	}
	else
	{
		return baga->next;
	}
}

二,反轉鏈表

鏈接:反轉鏈表

這道題的介紹很簡單,給定一個鏈表head,將鏈表反轉過來。就像這樣。
詳解鏈表oJ<反轉鏈表,鏈表的中間節(jié)點及鏈表的回文>,鏈表,數(shù)據(jù)結構

詳解鏈表oJ<反轉鏈表,鏈表的中間節(jié)點及鏈表的回文>,鏈表,數(shù)據(jù)結構
需要注意的是,這個鏈表的長度有可能為零。
思路:
?解決這道題,不可冒昧更改一個節(jié)點的指向,要記錄后續(xù)節(jié)點,同時還要保留前一個節(jié)點,好讓這個節(jié)點可以指向前一節(jié)點,所以要設置三個結構體指針變量,分別表示要修改的節(jié)點,要修改節(jié)點的前一節(jié)點,該節(jié)點的后邊的節(jié)點。
實現(xiàn)

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode*n1,*n2,*n3;
    n1=NULL;//設置n1為空
    n2=head;//n2為head,首先指向空
    if(n2)
    {
        n3=n2->next;//判斷n2是否為空,若為空則沒有next      
    }
    while(n2)
    {
        n2->next=n1;
        n1=n2;
        n2=n3;
        if(n3)//判斷n3是否為空
        {
            n3=n3->next;
        }
    }
    return n1;
}

下邊的動圖可以幫助大家理解
詳解鏈表oJ<反轉鏈表,鏈表的中間節(jié)點及鏈表的回文>,鏈表,數(shù)據(jù)結構
對比代碼看完這些動圖就可以很清晰的理解。

三,鏈表的回文

鏈接:鏈表的回文
詳解鏈表oJ<反轉鏈表,鏈表的中間節(jié)點及鏈表的回文>,鏈表,數(shù)據(jù)結構
設計時間復雜度為O(N),空間復雜度為O(1)的算法

時間復雜度的定義:在計算機科學中,算法的時間復雜度是一個函數(shù),它定量描述了該算法的運行時間。一個算法執(zhí)行所耗費的時間,從理論上說,是不能算出來的,只有你把你的程序放在機器上跑起來,才能知道。但是我們需要每個算法都上機測試嗎?是可以都上機測試,但是這很麻煩,所以才有了時間復雜度這個分析方式。一個算法所花費的時間與其中語句的執(zhí)行次數(shù)成正比例,算法中的基本操作的執(zhí)行次數(shù),為算法的時間復雜度。

?空間復雜度主要通過函數(shù)在運行時候顯式申請的額外空間來確定。
?上邊已經(jīng)說了鏈表的長度有限制,空間復雜度為O(1)無疑,只要寫出的代碼中不使用兩層以上循環(huán)遍歷,用有限的多個循環(huán),時間復雜度都為O(1)
判斷是否為回文結構
如用例中的1-2-2-1,從中間分割后兩邊對稱。
再如
1-2-3-2-1,仍然為回文結構。

如何判斷是否為回文結構呢?好像很難,因為不是雙向鏈表,我們比較的時候找不到尾的前一個,如果硬要一個一個判斷的話,時間復雜度一定不符合要求。

如果使用上邊的兩個題目的思路
?上邊的找中間節(jié)點,剛好為后一個中間節(jié)點,找到中間節(jié)點后,記錄中間節(jié)點后,將中間結點之后的鏈表反轉,反轉后就可以進行比較了。這也是這三道題放在一起的原因。直接cv,將函數(shù)復制過來,判斷函數(shù)內(nèi)容十分簡單,大家可以對照觀察。
思路已經(jīng)十分清楚了
實現(xiàn)如下:

class PalindromeList {
public:
struct ListNode* middleNode(struct ListNode* head) {
	struct ListNode* val = NULL;
	struct ListNode* baga = NULL;
	val = head;
	baga = head;
	while (val->next != NULL && val->next->next != NULL)
	{
		val = val->next->next;
		baga = baga->next;
	}
	if (val->next == NULL)
	{
		return baga;
	}
	else
	{
		return baga->next;
	}
}
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=n3->next;
         }
    return n1;
}

    bool chkPalindrome(ListNode* A) {
        // write code here
        struct ListNode*mid=middleNode(A);
        struct ListNode* rmid =reverseList(mid);
        while(rmid&&A)
        {
            if(rmid->val!=A->val)
            {
                return false;
            }
            rmid=rmid->next;
        A=A->next;
        }
        return true;

    }
};

鄙人才疏學淺,如果有更好的方法歡迎評論區(qū)留言。
?這三道題講到這里就結束啦,如果有幫助的話希望大家三連支持哇文章來源地址http://www.zghlxwxcb.cn/news/detail-715779.html

到了這里,關于詳解鏈表oJ<反轉鏈表,鏈表的中間節(jié)點及鏈表的回文>的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關文章

  • 【鏈表OJ 3】鏈表的中間結點

    【鏈表OJ 3】鏈表的中間結點

    前言:? ? ? ? ? 本文收錄于http://t.csdn.cn/n6UEP數(shù)據(jù)結構刷題的博客中,首先歡迎大家的來訪,其次如有錯誤,非常歡迎大家的指正!我會及時更正錯誤! 目錄 一.鏈表的中間結點? 1.1原理:快慢指針的使用 鏈表元素個數(shù)為奇數(shù)時 鏈表元素個數(shù)為偶數(shù)時 1.2循環(huán)條件問題? 來源:87

    2024年02月14日
    瀏覽(61)
  • 【鏈表OJ】鏈表中倒數(shù)第k個結點 合并兩個鏈表(含哨兵位) 分割鏈表 鏈表的回文結構

    【鏈表OJ】鏈表中倒數(shù)第k個結點 合并兩個鏈表(含哨兵位) 分割鏈表 鏈表的回文結構

    前言: ????個人主頁:??????Dream_Chaser~????? ??刷題專欄:http://t.csdn.cn/UlvTc ??本篇內(nèi)容:力扣和牛客上鏈表OJ題目 目錄 ?一、鏈表中倒數(shù)第k個結點 題目描述: 解題思路: 二.合并兩個鏈表(含哨兵位)? 題目描述: 解題思路:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    2024年02月12日
    瀏覽(78)
  • 反轉鏈表、鏈表的中間結點、合并兩個有序鏈表【LeetCode刷題日志】

    反轉鏈表、鏈表的中間結點、合并兩個有序鏈表【LeetCode刷題日志】

    給你單鏈表的頭節(jié)點 head ,請你反轉鏈表,并返回反轉后的鏈表。 力扣(LeetCode)官網(wǎng) - 全球極客摯愛的技術成長平臺 這里解釋一下三個指針的作用: n1:記錄上一個節(jié)點,如果是第一個就指向空 n2:記錄此節(jié)點的位置 n3:記錄下一個節(jié)點的位置,讓翻轉后能找到下一個節(jié)點

    2024年02月03日
    瀏覽(24)
  • 【算法入門&鏈表】【模板】鏈表|反轉鏈表|合并排序鏈表|刪除鏈表的節(jié)點

    【算法入門&鏈表】【模板】鏈表|反轉鏈表|合并排序鏈表|刪除鏈表的節(jié)點

    ?作者簡介:熱愛后端語言的大學生,CSDN內(nèi)容合伙人 ?精品專欄:C++面向對象 ??系列專欄:算法百煉成神 本專欄收錄的均為??途W(wǎng)的算法題目,內(nèi)含鏈表、雙指針、遞歸、動態(tài)規(guī)劃、基本數(shù)據(jù)結構等算法思想的具體運用。??途W(wǎng)不僅有大量的經(jīng)典算法題目,也有大廠的面

    2024年02月17日
    瀏覽(20)
  • 【leetcode】鏈表的中間節(jié)點|鏈表中倒數(shù)第k個節(jié)點

    【leetcode】鏈表的中間節(jié)點|鏈表中倒數(shù)第k個節(jié)點

    目錄 1.鏈表的中間節(jié)點 2.鏈表中倒數(shù)第k個節(jié)點? 思路1:遍歷鏈表,統(tǒng)計節(jié)點個數(shù)count,返回第count/2 +1個節(jié)點? ??Note: 注意循環(huán)條件為--mid,--mid循環(huán)執(zhí)行mid-1次,mid--循環(huán)mid次,返回的是中間節(jié)點的下一個節(jié)點 思路二:快慢指針 設置一個慢指針slow,一個快指針fast,慢指針一

    2024年02月15日
    瀏覽(18)
  • LC-鏈表的中間節(jié)點(雙指針)

    LC-鏈表的中間節(jié)點(雙指針)

    鏈接:https://leetcode.cn/problems/middle-of-the-linked-list/description/ 描述:給你單鏈表的頭結點 head ,請你找出并返回鏈表的中間結點。 如果有兩個中間結點,則返回第二個中間結點。 輸入:head = [1,2,3,4,5] 輸出:[3,4,5] 解釋:鏈表只有一個中間結點,值為 3 。 輸入:head = [1,2,3,4,5,6

    2024年02月12日
    瀏覽(24)
  • 【Leetcode】移除鏈表元素 鏈表的中間節(jié)點 鏈表中倒數(shù)第k個節(jié)點

    【Leetcode】移除鏈表元素 鏈表的中間節(jié)點 鏈表中倒數(shù)第k個節(jié)點

    目錄 一.【Leetcode203】移除鏈表元素 1.鏈接 2.題目再現(xiàn) ?A.雙指針法 B.類尾刪法 C.哨兵位 二.【Leetcode876】鏈表的中間節(jié)點 1.鏈接:鏈表的中間節(jié)點 2.題目再現(xiàn) 3.解法:快慢指針 三.鏈表中倒數(shù)第k個節(jié)點 1.鏈接:鏈表中倒數(shù)第k個節(jié)點 2.題目再現(xiàn) 3.解法 :快慢指針 1.鏈接 移除鏈表

    2024年02月01日
    瀏覽(25)
  • 【C語言】Leetcode 876. 鏈表的中間節(jié)點

    【C語言】Leetcode 876. 鏈表的中間節(jié)點

    主頁:17_Kevin-CSDN博客 專欄:《Leetcode》 ?通過題目的要求可以判斷出有兩種示例要解決,一種是偶數(shù)節(jié)點的鏈表,一種是奇數(shù)節(jié)點的鏈表,應對這兩種情況我們需要使程序對二者都可以兼容。 中間節(jié)點,只要找到中間的位置就能找到中間的節(jié)點。那么這個位置要怎么去查找

    2024年03月14日
    瀏覽(22)
  • 【數(shù)據(jù)結構和算法】刪除鏈表的中間節(jié)點

    【數(shù)據(jù)結構和算法】刪除鏈表的中間節(jié)點

    Java基礎合集 數(shù)據(jù)結構與算法合集 設計模式合集 多線程合集 分布式合集 ES合集 其他系列文章導航 文章目錄 前言 一、題目描述 二、題解 三、代碼 四、復雜度分析 這是力扣的 2095 題,難度為中等,解題方案有很多種,本文講解我認為最奇妙的一種。 慢慢開始鏈表的模塊了

    2024年01月19日
    瀏覽(20)
  • 力扣2095.刪除鏈表的中間節(jié)點(java快慢指針)

    Problem: 2095. 刪除鏈表的中間節(jié)點 利用快慢指針,快指針每次走兩步,慢指針每次走一步(循環(huán)退出條件是fast指針不為空同時fast.next不為空),但是我們?nèi)菀装l(fā)現(xiàn)這樣到最后slow指針正好指向我們需要刪除的節(jié)點,由于沒有前指針,這樣我們不便操作。此時可以借助虛擬頭節(jié)點

    2024年02月06日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包