第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

每天AC系列(十):兩兩交換鏈表中的節(jié)點(diǎn)

標(biāo)簽:
Java 算法

1 题目

LeetCode第24题,交换链表的相邻节点.
在这里插入图片描述

2 直接交换

直接交换的思想很简单,遍历一次链表,进行两两交换.

ListNode newHead = new ListNode(0);
newHead.next = head;
ListNode before = newHead;
ListNode first = head;
ListNode second = head.next;
ListNode move;

while(true)
{
    move = second.next;
    first.next = second.next;
    second.next = first;

    before.next = second;
    before = first;

    first = move;

    if(move != null && move.next != null)
    {
        second = move.next;
        move = move.next.next;
    }
    else 
        break;
}
return newHead.next;

虽然思想简单,但是,并不好实现,有点绕,首先增加一个头节点,first,second当前要交换的两个节点,before为first的前一个节点,用来连上first,move是为了更新first与second节点的节点,进入while循环后,首先把first与second交换,接着用before连上first同时更新before,然后利用move更新first与second.
在这里插入图片描述

3 递归交换

递归交换就是每次只交换头两个节点,然后把第三个节点作为下一次递归交换的头结点继续递归交换.

if(head != null && head.next != null)
{
    ListNode t = head.next;
    head.next = swapPairs(t.next);
    t.next = head;
    return t;
}
return head;

要注意交换的顺序,先赋值head.next,head.next为剩下的节点,然后把t连上head.
在这里插入图片描述

4 插入法

新建一个链表,采用尾插法,依次插入交换的节点.
对于原链表设置两个指针a与b,令a指向首个节点,b指向第二个节点,然后对于新链表,先插入b,再插入a,最后更新a,b,使a,b都指向后继的后继,这样依次插入b与a就会得到所需的链表.

if(head == null || head.next == null)
    return head;
ListNode a = head;
ListNode b = head.next;
ListNode newHead = new ListNode(0);
ListNode t = newHead;
while(a != null && b != null)
{
    t.next = new ListNode(b.val);
    t = t.next;
    t.next = new ListNode(a.val);
    t = t.next;
    if(b.next != null)
        b = b.next.next;
    a = a.next.next;
}
if(a != null)
    t.next = new ListNode(a.val);
return newHead.next;

在更新a,b时,对于a不需要判断a.next是否为空,因为a.next肯定为b,肯定不为空,但是对于b,当到达最后一个节点时,b.next为空,因此需要加上判断.当a,b其中一个为空后跳出循环,最后的判断a是否为空表示节点个数为奇数,此时a指向最后一个节点,直接插入a.
在这里插入图片描述

5 插入法改进

对于上面的插入法,由于ab是连在一起的,因此可以只使用其中一个,再优化判空与插入操作.

ListNode newHead = new ListNode(0);
ListNode t = newHead;
while(head != null)
{
    if(head.next != null)
    {
        t.next = new ListNode(head.next.val);
        t = t.next;
    }
    t.next = new ListNode(head.val);
    t = t.next;
    if(head.next == null)
        break;
    head = head.next.next;
}
return newHead.next;

要注意while中的判空条件,因为节点的个数有可能是奇数,在插入后一个节点前需要先判断是否为空,再插入前一个节点.
在这里插入图片描述

6 源码

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
JAVA開發(fā)工程師
手記
粉絲
5
獲贊與收藏
30

關(guān)注作者,訂閱最新文章

閱讀免費(fèi)教程

  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消