(Python) одиночный LinkedList - Leetcode - PullRequest
1 голос
/ 09 октября 2019

Я работаю над этой проблемой Leetcode https://leetcode.com/problems/odd-even-linked-list/. Я уже пытался отладить программу с помощью инструмента отладки и нашел ошибку в моем коде, но я не совсем понимаю ошибку и не знаюкак это исправить. Ошибка пришла из этой строки: odd_head.next = even_head Спасибо за вашу помощь!

Проблема в том, что: учитывая односвязный список, сгруппируйте все нечетные узлы вместе, за которыми следуют четные узлы. Обратите внимание, что здесь речь идет о номере узла, а не о значении в узлах.

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

Input: 1->2->3->4->5->NULL
Output: 1->3->5->2->4->NULL
def oddEvenList(self, head):
    odd_head = head
    even_head = head.next

    while(odd_head.next and odd_head.next.next):
        temp = odd_head.next.next
        odd_head.next = temp
        odd_head = temp

    odd_head.next = even_head # BUG ON THIS LINE

    while(even_head.next and even_head.next.next):
        temp = even_head.next.next
        even_head.next = temp
        even_head = temp

    return odd_head

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Рассмотрим этот список: 2->1->3->5->6->4->7->NULL

Когда ваш код достигнет:

odd_head.next = even_head

Ссылки будут:

2->3
3->6
6->7
7->NULL

1->3
5->6
4->7

even_head.next будет 3

even_head.next.next будет 6, а не 5 (ЭТО НЕПРАВИЛЬНО.)

Причина в том, что ссылки изменяются в первом цикле while! Отсюда все начинает ошибаться.


Из многих возможных решений одно простое решение:

def oddEvenList(self, head):
    if not head:
        return head

    odd_head = head
    even_head_copy = even_head = head.next

    while odd_head and even_head and even_head.next:
        odd_head.next = even_head.next
        odd_head = odd_head.next

        even_head.next = odd_head.next
        even_head = even_head.next

    odd_head.next = even_head_copy
    return head
1 голос
/ 09 октября 2019

Правильным решением будет:

class Solution:
    def oddEvenList(self, head):
        try:
            odd = head
            even_head=head.next
            even = head.next
            cur=even.next
        except:
            return head
        try:
            while cur!=None:
                odd.next=cur
                odd=odd.next
                even.next=cur.next
                even=even.next
                cur=cur.next.next
                print(even.val)
        except:
            pass
        odd.next=even_head
        return head

Первый блок try - инициализация переменной и обработка углового случая, когда список содержит менее 2 элементов. Вторая попытка блокирует цикл по списку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...