給定一個單鏈表,把全部的奇數節點和偶數節點分別排在一塊兒。請注意,這裏的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。java
請嘗試使用原地算法完成。你的算法的空間複雜度應爲 O(1),時間複雜度應爲 O(nodes),nodes 爲節點總數。node
Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes.算法
You should try to do it in place. The program should run in O(1) space complexity and O(nodes) time complexity.ide
示例 1:學習
輸入: 1->2->3->4->5->NULL 輸出: 1->3->5->2->4->NULL
示例 2:spa
輸入: 2->1->3->5->6->4->7->NULL 輸出: 2->3->6->7->1->5->4->NULL
說明:指針
Note:code
這道題很簡單,迭代鏈表,將該鏈表奇數位節點和偶數位節點分別取出分隔成兩個鏈表,而後將奇偶兩個鏈表鏈接起來組成新鏈表,返回頭節點便可。rem
須要記錄偶數位節點的第一個節點,由於這是偶數鏈表的頭節點,最後拼接鏈表時要用奇數鏈表的尾節點鏈接該節點。get
你能夠定義一個 int 型數值 i 爲 0,每次迭代鏈表時 i 值自增 1 (i++),並判斷 i 值除以 2 的餘數爲奇偶( i%2 ),以此爲根據判斷該節點是添加到奇鏈表後仍是偶鏈表後。缺點是每次都要給 i 作自增運算 求餘運算和判斷餘數,這在鏈表很長時將會佔用很長的時間。並且int型值上限爲 2147483647 ,超過這個值須要額外考慮方法。
另一種方法是以第一個奇偶節點開始,將奇節點指向偶節點的下一個節點(確定是奇節點),而後刷新奇鏈表,此時奇節點指向新加入的節點;將偶節點指向奇節點的下一個節點(確定是偶節點),而後刷新偶鏈表,此時偶節點指向新加入的節點;......以此類推直到遇到空節點。
class Solution { public ListNode oddEvenList(ListNode head) { if (head == null || head.next == null || head.next.next == null) return head;//若是該鏈表內節點數在兩個及如下直接返回頭節點 ListNode tmp = head.next;//暫存偶節點的第一個 ListNode odd = head;//奇節點的第一個 ListNode even = head.next;//偶節點的第一個 while (even != null && even.next != null) {//循環條件,偶節點遇空時結束 odd.next = even.next;//奇節點指向偶節點的下一個節點 odd = odd.next;//刷新奇鏈表指針 even.next = odd.next;//偶節點指向奇節點的下一個節點 even = even.next;//刷新偶鏈表指針 } odd.next = tmp;//鏈接雙鏈表 return head; } }
class Solution: def oddEvenList(self, head: ListNode) -> ListNode: if not head or not head.next or not head.next.next: return head tmp = head.next odd, even = head, head.next while even and even.next: odd.next = even.next odd = odd.next even.next = odd.next even = even.next odd.next = tmp return head
歡迎關注公衆號一塊兒學習:愛寫Bug