每周一道算法題(二十)

本周題目難度"Medium",碎片化的時間加起來,我大概用了三個小時吧,還是看財(cái)務(wù)學(xué)習(xí)視頻的時候突然有了想法(學(xué)習(xí)的效率多低,唉。。。)

題目:給你一個單鏈表,要求你將鏈表相臨的兩個節(jié)點(diǎn)交換后返回。即第一個節(jié)點(diǎn)和第二個節(jié)點(diǎn)交換,第三個節(jié)點(diǎn)和第四個節(jié)點(diǎn)交換。。。要是最后剩了一個奇數(shù)節(jié)點(diǎn)就不用換了

思路:這題還需要思路么?就兩兩交換,小學(xué)生都會,只是代碼實(shí)現(xiàn)就比較糾結(jié)了,所以直接來看代碼吧(效率一般):

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* swapPairs(struct ListNode* head) {
    //如果給的是空鏈,直接返回
    if (head == NULL) return head;
    //若是單節(jié)點(diǎn)鏈表,也直接返回
    if (head->next == NULL) return head;
    //將第二個節(jié)點(diǎn)作為新頭部
    struct ListNode* newHead = head->next;
    struct ListNode* result = newHead;
    //將原頭節(jié)點(diǎn)的下一個節(jié)點(diǎn)指向原第三個節(jié)點(diǎn)
    head->next = head->next->next;
    //將新節(jié)點(diǎn)的第二個節(jié)點(diǎn)置為原頭節(jié)點(diǎn),至此,頭節(jié)點(diǎn)和第二個節(jié)點(diǎn)就交換完成了
    result->next = head;
    //移動到第二個節(jié)點(diǎn)處
    result = result->next;
    //如果第三個節(jié)點(diǎn)不為空(為了方便注釋,我就按第一次執(zhí)行來說)
    while(result->next != NULL) {
        //如果第四個節(jié)點(diǎn)不為空
        if (result->next->next != NULL) {
            //記錄第三個節(jié)點(diǎn)
            struct ListNode* temp1 = result->next;
            //將第四個節(jié)點(diǎn)置為新的第三個節(jié)點(diǎn)
            result->next = result->next->next;
            //移到下一個節(jié)點(diǎn)
            result = result->next;
            //記錄第五個節(jié)點(diǎn)(是NULL也無所謂)
            struct ListNode* temp2 = result->next;
            //將第四個節(jié)點(diǎn)置為原第三個節(jié)點(diǎn)
            result->next = temp1;
            //移到下一個節(jié)點(diǎn)
            result = result->next;
            //拼接第五個節(jié)點(diǎn),至此,第三個和第四個節(jié)點(diǎn)交換完成
            result->next = temp2;
        //如果沒有第四個節(jié)點(diǎn)(最后一個是奇數(shù)節(jié)點(diǎn)),直接返回
        }else return newHead;
    }
    return newHead;
}

方法有很多,我寫的還是比較low的,小伙伴可以開動大腦,多寫幾種。

版權(quán)聲明:本文為 Crazy Steven 原創(chuàng)出品,歡迎轉(zhuǎn)載,轉(zhuǎn)載時請注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 本周題目難度級別"hard" 題目:給你一個單向鏈表和一個數(shù)字k,要求將鏈表的每k個節(jié)點(diǎn)進(jìn)行倒置,如鏈表為[1,2...
    CrazySteven閱讀 772評論 0 3
  • 上周的算法題太難了,沒做出來,哈哈,這周的題目難度級別是“Medium” 題目:給你一個組合,找出全排列中的下一個...
    CrazySteven閱讀 890評論 0 2
  • 由于本周的題目比較簡單,又很相似,于是就來上兩道吧,兩道題的難度級別都是"Easy" 題目:給一個有序的數(shù)組,將其...
    CrazySteven閱讀 713評論 1 4
  • 本周的題目難度級別'Medium' 題目:本周的題目又是一道造輪子的題,就是不用‘*’和‘/’來實(shí)現(xiàn)除法。 思路:...
    CrazySteven閱讀 601評論 0 2
  • 本周題目難度'Medium',所以還是用C來寫,其實(shí)C和Python差不多,能用C寫的,個人感覺用Python更好...
    CrazySteven閱讀 967評論 3 2