天天看點

遞歸删除單連結清單中所有值為x的元素_單連結清單逆序

遞歸删除單連結清單中所有值為x的元素_單連結清單逆序

代碼有解釋,可能一開始看不到,更着動手多敲幾遍就能掌握了。加油。

題目描述:

給定一個帶頭結點的單連結清單,請将其逆序。即如果單連結清單原來為head->1->2->3->4->5->6->7,那麼逆序後變為head->7->6->5->4->3->2->1。

  • 由于單連結清單與數組不同, 中每個結點的位址都存儲在其前驅結點的指針域中, 是以,對單連結清單中任何 個結點的通路隻能從連結清單的頭指針開始進行周遊。在對連結清單的操作 過程中,需要特别注意在修改結點指針域的時候,記錄下後繼結點的位址,否 會丢失後繼結點。

先定義好連結清單結構

# -*- coding: utf-8 -*-
           

一、遞歸逆序

思路:

1、首先将1 -> 2 -> 3 ->4變成1 -> 4-> 3 -> 2(其中2 -> 3 ->4變成4-> 3 -> 2,采用遞歸方式實作)

2、再将head頭節點1移到尾巴,作為尾結點,由于上一個尾結點2,是原先的head.next,此時将2的next指針指向頭節點,即head.next.next = head,然後尾結點指向空,即head.next = None

遞歸删除單連結清單中所有值為x的元素_單連結清單逆序

3、特殊情況:頭節點為空或者隻有1個節點

"""
           

算法性能分析:

由于遞歸法也隻需要對連結清單進行 次周遊,是以,算法的時間複雜度也為 O(N) ,其中,N為連結清單的長度。

  • 遞歸法的主要優點是:思路比較直覺,容易了解,而且也不需要儲存前驅 結點的位址
  • 缺點是:算法實作的難度較大,此外,由于遞歸法需要不斷地調用自己,需要 額外的壓技與彈枝操作,是以, 與方法 相比性能會有所 降。

二、就地逆序

遞歸删除單連結清單中所有值為x的元素_單連結清單逆序

移動:第1次指針操作,将目前節點指針cur.next值臨時儲存到nex,即nex = cur.next, 第2次指針操作,将目前的指針cur.next指向其前一個節點pre, 即cur.next = pre,這樣就實作了對單個節點的操作。

操作節點的變量移動,pre結點後移:pre_node = cur_node ,cur指向下一個操作節點,即cur = nex,這樣通過while循環即可實作對每個節點操作。

特殊情況:連結清單為空連結清單、連結清單為單節點,直接傳回即可,無需逆序操作

"""
           

三、插入逆序

直假定原連結清單為head->1->2->3->4->5->6->7,在周遊到2的時候,将其插入到頭結點後,連結清單變為head->2->1->3->4->5->6->7,同理将後序周遊到的所有結點都插入到頭結點head後,就可以實作連結清單的逆序。實作代碼如下:

"""
           

測試

# 當然,也許還有别的方法,比如建一個輔助的連結清單
           

參考:

《python程式員寶典》