Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Chương trình đảo ngược đoạn giữa trong danh sách liên kết bằng Python


Cho danh sách liên kết và hai chỉ số i, j. Đảo ngược đoạn từ nút thứ i đến nút thứ j. Trả về danh sách đã cập nhật.

Ví dụ: [1,2,3,4,5,6,7,8,9], i=2, j=6 → [1,2,7,6,5,4,3,8,9].

Giải thuật

  • Tạo nút giả prev_head trỏ đến head.
  • Di chuyển prev, curr đến vị trí i.
  • Lưu rev_before = prev, rev_end = curr.
  • Đảo ngược j-i+1 nút: lặp, tmp = curr.next; curr.next = prev; prev, curr = curr, tmp.
  • Nối lại: rev_before.next = prev, rev_end.next = curr.
  • Trả về prev_head.next.

Ví dụ minh họa

class ListNode:
    def __init__(self, data, next=None):
        self.val = data
        self.next = next

def make_list(elements):
    head = ListNode(elements[0])
    for element in elements[1:]:
        ptr = head
        while ptr.next:
            ptr = ptr.next
        ptr.next = ListNode(element)
    return head

def print_list(head):
    ptr = head
    print('[', end="")
    while ptr:
        print(ptr.val, end=", ")
        ptr = ptr.next
    print(']')

class Solution:
    def solve(self, node, i, j):
        prev_head = ListNode(None, node)
        prev, curr = prev_head, node
        for _ in range(i):
            prev, curr = curr, curr.next
        rev_before, rev_end = prev, curr
        for _ in range(j - i + 1):
            tmp = curr.next
            curr.next = prev
            prev, curr = curr, tmp
        rev_before.next, rev_end.next = prev, curr
        return prev_head.next

ob = Solution()
head = make_list([1,2,3,4,5,6,7,8,9])
i = 2
j = 6
print_list(ob.solve(head, i, j))

Đầu vào

[1,2,3,4,5,6,7,8,9], 2, 6

Đầu ra

[1, 2, 7, 6, 5, 4, 3, 8, 9, ]