奇偶鏈表
給定一個單鏈表,把所有的奇數(shù)節(jié)點和偶數(shù)節(jié)點分別排在一起。請注意,這里的奇數(shù)節(jié)點和偶數(shù)節(jié)點指的是節(jié)點編號的奇偶性,而不是節(jié)點的值的奇偶性。
請嘗試使用原地算法完成。你的算法的空間復(fù)雜度應(yīng)為 O(1),時間復(fù)雜度應(yīng)為 O(nodes),nodes 為節(jié)點總數(shù)。
說明:
- 應(yīng)當(dāng)保持奇數(shù)節(jié)點和偶數(shù)節(jié)點的相對順序。
- 鏈表的第一個節(jié)點視為奇數(shù)節(jié)點,第二個節(jié)點視為偶數(shù)節(jié)點,以此類推。
輸入: 1->2->3->4->5->NULL
輸出: 1->3->5->2->4->NULL
輸入: 2->1->3->5->6->4->7->NULL
輸出: 2->3->6->7->1->5->4->NULL
我們可以使用兩個指針來做:
- odd指向奇節(jié)點,even指向偶節(jié)點
- 讓奇節(jié)點的next指向偶節(jié)點的next,同時奇節(jié)點往后平移,同理,讓偶節(jié)點的next指向奇節(jié)點的next,同時偶節(jié)點向后平移
- 重復(fù)以上操作,直至到達鏈表尾部,最后讓奇節(jié)點的next指向第一個偶節(jié)點即可
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def oddEvenList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head is None or head.next is None:
return head
odd = head
even = head.next
evenhead = even
while even and even.next:
odd.next = even.next
odd = odd.next
even.next = odd.next
even = even.next
odd.next = evenhead
return head