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

【數(shù)據(jù)結(jié)構(gòu)和算法】奇偶鏈表

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

其他系列文章導(dǎo)航

Java基礎(chǔ)合集
數(shù)據(jù)結(jié)構(gòu)與算法合集

設(shè)計模式合集

多線程合集

分布式合集

ES合集


文章目錄

其他系列文章導(dǎo)航

文章目錄

前言

一、題目描述

二、題解

2.1?方法一:分離節(jié)點后合并

三、代碼

3.1?方法一:分離節(jié)點后合并

四、復(fù)雜度分析

4.1?方法一:分離節(jié)點后合并


前言

這是力扣的 328 題,難度為中等,解題方案有很多種,本文講解我認為最奇妙的一種。

慢慢開始鏈表的模塊了,這道題是一道非常好的隊列的例題,很有代表性。


一、題目描述

給定單鏈表的頭節(jié)點?head?,將所有索引為奇數(shù)的節(jié)點和索引為偶數(shù)的節(jié)點分別組合在一起,然后返回重新排序的列表。

第一個節(jié)點的索引被認為是?奇數(shù)?,?第二個節(jié)點的索引為?偶數(shù)?,以此類推。

請注意,偶數(shù)組和奇數(shù)組內(nèi)部的相對順序應(yīng)該與輸入時保持一致。

你必須在?O(1)?的額外空間復(fù)雜度和?O(n)?的時間復(fù)雜度下解決這個問題。

示例 1:

【數(shù)據(jù)結(jié)構(gòu)和算法】奇偶鏈表,數(shù)據(jù)結(jié)構(gòu)與算法合集,數(shù)據(jù)結(jié)構(gòu),算法,鏈表,java,線性回歸,貪心算法,動態(tài)規(guī)劃

輸入: head = [1,2,3,4,5]
輸出:?[1,3,5,2,4]

示例 2:

【數(shù)據(jù)結(jié)構(gòu)和算法】奇偶鏈表,數(shù)據(jù)結(jié)構(gòu)與算法合集,數(shù)據(jù)結(jié)構(gòu),算法,鏈表,java,線性回歸,貪心算法,動態(tài)規(guī)劃

輸入: head = [2,1,3,5,6,4,7]
輸出: [2,3,6,7,1,5,4]

提示:

  • n ==??鏈表中的節(jié)點數(shù)
  • 0 <= n <= 104
  • -106?<= Node.val <= 106

二、題解

2.1?方法一:分離節(jié)點后合并

思路與算法:

如果鏈表為空,則直接返回鏈表。

對于原始鏈表,每個節(jié)點都是奇數(shù)節(jié)點或偶數(shù)節(jié)點。頭節(jié)點是奇數(shù)節(jié)點,頭節(jié)點的后一個節(jié)點是偶數(shù)節(jié)點,相鄰節(jié)點的奇偶性不同。因此可以將奇數(shù)節(jié)點和偶數(shù)節(jié)點分離成奇數(shù)鏈表和偶數(shù)鏈表,然后將偶數(shù)鏈表連接在奇數(shù)鏈表之后,合并后的鏈表即為結(jié)果鏈表。

原始鏈表的頭節(jié)點 head 也是奇數(shù)鏈表的頭節(jié)點以及結(jié)果鏈表的頭節(jié)點,head 的后一個節(jié)點是偶數(shù)鏈表的頭節(jié)點。令 evenHead = head.next,則 evenHead 是偶數(shù)鏈表的頭節(jié)點。

維護兩個指針 odd 和 even 分別指向奇數(shù)節(jié)點和偶數(shù)節(jié)點,初始時 odd = head,even = evenHead。通過迭代的方式將奇數(shù)節(jié)點和偶數(shù)節(jié)點分離成兩個鏈表,每一步首先更新奇數(shù)節(jié)點,然后更新偶數(shù)節(jié)點。

  • 更新奇數(shù)節(jié)點時,奇數(shù)節(jié)點的后一個節(jié)點需要指向偶數(shù)節(jié)點的后一個節(jié)點,因此令 odd.next = even.next,然后令 odd = odd.next,此時 odd 變成 even 的后一個節(jié)點。
  • 更新偶數(shù)節(jié)點時,偶數(shù)節(jié)點的后一個節(jié)點需要指向奇數(shù)節(jié)點的后一個節(jié)點,因此令 even.next = odd.next,然后令 even = even.next,此時 even 變成 odd 的后一個節(jié)點。

在上述操作之后,即完成了對一個奇數(shù)節(jié)點和一個偶數(shù)節(jié)點的分離。重復(fù)上述操作,直到全部節(jié)點分離完畢。全部節(jié)點分離完畢的條件是 even 為空節(jié)點或者 even.next 為空節(jié)點,此時 odd 指向最后一個奇數(shù)節(jié)點(即奇數(shù)鏈表的最后一個節(jié)點)。

最后令 odd.next = evenHead,將偶數(shù)鏈表連接在奇數(shù)鏈表之后,即完成了奇數(shù)鏈表和偶數(shù)鏈表的合并,結(jié)果鏈表的頭節(jié)點仍然是 head。

如下圖所示:

【數(shù)據(jù)結(jié)構(gòu)和算法】奇偶鏈表,數(shù)據(jù)結(jié)構(gòu)與算法合集,數(shù)據(jù)結(jié)構(gòu),算法,鏈表,java,線性回歸,貪心算法,動態(tài)規(guī)劃


三、代碼

3.1?方法一:分離節(jié)點后合并

Java版本:

class Solution {    
    public ListNode oddEvenList(ListNode head) {
        if (head == null) {
            return head;
        }
        ListNode odd = head;
        ListNode evenHead = head.next;
        ListNode even = evenHead;
        while (even != null && even.next != null) {
            odd.next = even.next;
            odd = odd.next;
            even.next = odd.next;
            even = even.next;
        }
        odd.next = evenHead;
        return head;
    }
}

C++版本:

class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if (head == nullptr) {
            return head;
        }
        ListNode* evenHead = head->next;
        ListNode* odd = head;
        ListNode* even = evenHead;
        while (even != nullptr && even->next != nullptr) {
            odd->next = even->next;
            odd = odd->next;
            even->next = odd->next;
            even = even->next;
        }
        odd->next = evenHead;
        return head;
    }
};

Python版本:

class Solution:
    def oddEvenList(self, head: ListNode) -> ListNode:
        if not head:
            return head
        
        evenHead = head.next
        odd, even = head, evenHead
        while even and even.next:
            odd.next = even.next
            odd = odd.next
            even.next = odd.next
            even = even.next
        odd.next = evenHead
        return head

Go版本:文章來源地址http://www.zghlxwxcb.cn/news/detail-808604.html

func oddEvenList(head *ListNode) *ListNode {
    if head == nil {
        return head
    }
    evenHead := head.Next
    odd := head
    even := evenHead
    for even != nil && even.Next != nil {
        odd.Next = even.Next
        odd = odd.Next
        even.Next = odd.Next
        even = even.Next
    }
    odd.Next = evenHead
    return head
}

四、復(fù)雜度分析

4.1?方法一:分離節(jié)點后合并

  • 時間復(fù)雜度:O(n),其中 n?是鏈表的節(jié)點數(shù)。需要遍歷鏈表中的每個節(jié)點,并更新指針。
  • 空間復(fù)雜度:O(1)。只需要維護有限的指針。

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)和算法】奇偶鏈表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Python數(shù)據(jù)結(jié)構(gòu)與算法-數(shù)據(jù)結(jié)構(gòu)(列表、棧、隊列、鏈表)

    Python數(shù)據(jù)結(jié)構(gòu)與算法-數(shù)據(jù)結(jié)構(gòu)(列表、棧、隊列、鏈表)

    數(shù)據(jù)結(jié)構(gòu)是指相互之間存在這一種或者多種關(guān)系的數(shù)據(jù)元素的集合和該集合中元素之間的關(guān)系組成。 簡單來說,數(shù)據(jù)結(jié)構(gòu)就是設(shè)計數(shù)據(jù)以何種方式組織并存儲在計算機中。 比如:列表、集合與字典等都是一種數(shù)據(jù)結(jié)構(gòu)。 N.Wirth:“程序=數(shù)據(jù)結(jié)構(gòu)+算法” 數(shù)據(jù)結(jié)構(gòu)按照其 邏輯結(jié)

    2024年02月08日
    瀏覽(36)
  • 數(shù)據(jù)結(jié)構(gòu)與算法:雙向鏈表

    數(shù)據(jù)結(jié)構(gòu)與算法:雙向鏈表

    朋友們大家好啊,在上節(jié)完成單鏈表的講解后,我們本篇文章來對 帶頭循環(huán)雙向鏈表進行講解 單鏈表中,一個節(jié)點存儲數(shù)據(jù)和指向下一個節(jié)點的指針,而雙向鏈表除了上述兩個內(nèi)容,還包括了 指向上一個節(jié)點的指針 帶頭的雙向鏈表,是指在雙向鏈表的最前端添加了一個 額

    2024年02月20日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)和算法】反轉(zhuǎn)鏈表

    【數(shù)據(jù)結(jié)構(gòu)和算法】反轉(zhuǎn)鏈表

    Java基礎(chǔ)合集 數(shù)據(jù)結(jié)構(gòu)與算法合集 設(shè)計模式合集 多線程合集 分布式合集 ES合集 其他系列文章導(dǎo)航 文章目錄 前言 一、題目描述 二、題解 2.1 方法一:迭代(雙指針) 2.2?方法二:遞歸 三、代碼 3.1 方法一:迭代(雙指針) 3.2?方法二:遞歸 四、復(fù)雜度分析 4.1 方法一:迭代

    2024年01月18日
    瀏覽(32)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】雙向鏈表

    【數(shù)據(jù)結(jié)構(gòu)與算法】雙向鏈表

    作者:舊夢拾遺186 專欄:數(shù)據(jù)結(jié)構(gòu)成長日記 ? 帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨存儲數(shù)據(jù)。實際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實現(xiàn)以后會發(fā)現(xiàn)結(jié)構(gòu)會帶來很多優(yōu)勢,實現(xiàn)反而簡單了。 現(xiàn)在我們來通

    2024年02月11日
    瀏覽(30)
  • 算法與數(shù)據(jù)結(jié)構(gòu)之鏈表

    鏈表的定義,相信大家都知道,這里就不贅述了只是鏈表分單向鏈表和雙向鏈表,廢話不多說,直接上代碼 鏈表節(jié)點的定義: 打印鏈表的兩種方式: 翻轉(zhuǎn)單向鏈表:核心思路是先斷開連接,再將next指向前繼節(jié)點,為了避免斷開之后,找不到前繼節(jié)點,需要用一個臨時變量記

    2024年02月05日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)與算法(三):單向鏈表

    數(shù)據(jù)結(jié)構(gòu)與算法(三):單向鏈表

    鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯是通過鏈表種的指針鏈接次序?qū)崿F(xiàn)的。鏈表由一系列節(jié)點組成,每個節(jié)點包括兩部分:一個是存儲數(shù)據(jù)元素的數(shù)據(jù)域,一個是存儲下一個節(jié)點地址的指針域。單向鏈表從頭節(jié)點(也可以沒有頭節(jié)點)開始

    2024年02月15日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)與算法(四):雙向鏈表

    數(shù)據(jù)結(jié)構(gòu)與算法(四):雙向鏈表

    雙向鏈表概念和單向鏈表是一致的,區(qū)別在于雙向鏈表在單向鏈表的基礎(chǔ)上,指針區(qū)域多了一個指向上一個節(jié)點的指針。單向鏈表內(nèi)容可以參考我的上一篇文章:http://t.csdn.cn/Iu56H。 基本的數(shù)據(jù)結(jié)構(gòu)如圖所示: 雙向鏈表結(jié)構(gòu)包含了節(jié)點的數(shù)據(jù)內(nèi)容和兩個指針:指向前一個節(jié)點

    2024年02月14日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)與算法 | 鏈表(Linked List)

    數(shù)據(jù)結(jié)構(gòu)與算法 | 鏈表(Linked List)

    鏈表(Linked List)是一種線性數(shù)據(jù)結(jié)構(gòu),它由一系列節(jié)點(Node)組成,每個節(jié)點包含兩部分:數(shù)據(jù)和指向下(上)一個節(jié)點的引用(或指針)。鏈表中的節(jié)點按照線性順序連接在一起(相鄰節(jié)點不需要存儲在連續(xù)內(nèi)存位置),不像數(shù)組一樣存儲在連續(xù)的內(nèi)存位置。鏈表通常由

    2024年02月08日
    瀏覽(24)
  • 鏈表綜合算法設(shè)計(c++數(shù)據(jù)結(jié)構(gòu))

    ? 一、設(shè)計內(nèi)容 已知簡單的人事信息系統(tǒng)中職工記錄包含職工編號(no)、職工姓名(name)、部門名稱(depname)、職稱(title)和工資數(shù)(salary)等信息(可以增加其他信息),設(shè)計并完成一個簡單的人事信息管理系統(tǒng),要求完成但不限于以下功能: (1)?? ?增加一個職工信息

    2024年02月02日
    瀏覽(33)
  • 數(shù)據(jù)結(jié)構(gòu)——鏈表(java)

    數(shù)據(jù)結(jié)構(gòu)——鏈表(java)

    1.1 定義 鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的引用鏈接次序?qū)崿F(xiàn)的。 如圖所示: 1.2 鏈表分類 單向、雙向;帶頭、不帶頭;循環(huán)、非循環(huán) 重點 :單向不帶頭非循環(huán)、雙向不帶頭非循環(huán)(集合類底層) 如圖:單項帶頭非循環(huán)鏈表結(jié)

    2024年02月09日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包