Odd Even Linked List

Posted by Leetcode Solution on May 16, 2020

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.

Example 1:

Input: 1->2->3->4->5->NULL
Output: 1->3->5->2->4->NULL

Example 2:

Input: 2->1->3->5->6->4->7->NULL
Output: 2->3->6->7->1->5->4->NULL

Note:

  • The relative order inside both the even and odd groups should remain as it was in the input.
  • The first node is considered odd, the second node even and so on …

Solution

先定义下面几个指针, 偶数的头指针,偶数的next指针,奇数的next指针。

然后将奇数的next指针指向偶数的next指针。

然后将奇数指向奇数的next

再把偶数的next指针指向奇数的next。

偶数指向偶数的next。

直到偶数位指针为空并且它的next也为空,此时循环结束,把奇数的next指向偶数的头指针,最后返回头指针。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def oddEvenList(self, head: ListNode) -> ListNode:
        if not head:
            return None
        
        odd = head
        even =head.next
        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 = even_head
        return head
        

Youtube视频