Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python의 정렬된 이중 연결 목록에서 주어진 제품과 쌍 찾기


고유한 양수의 정렬된 이중 연결 목록이 있다고 가정합니다. 주어진 값 x와 곱이 같은 이중 연결 목록에서 쌍을 찾아야 합니다. 이 문제는 추가 공간을 차지하지 않고 해결된다는 점을 명심해야 합니다.

따라서 입력이 L =1 ⇔ 2 ⇔ 4 ⇔ 5 ⇔ 6 ⇔ 8 ⇔ 9 및 x =8과 같으면 출력은 (1, 8), (2, 4)

가 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • curr :=머리, nxt :=머리

  • nxt.next가 None이 아닌 동안 0이 아닌 경우 수행

    • nxt :=nxt.next

  • 발견됨 :=거짓

  • curr과 nxt가 null이 아니고 curr과 nxt가 다르며 nxt.next가 curr이 아닌 동안 do

    • (curr.data * nxt.data)가 x와 같으면

      • 찾았습니다 :=참

      • curr.data, nxt.data 쌍 표시

      • curr :=curr.next

      • nxt :=nxt.prev

    • 그렇지 않으면

      • if (curr.data * nxt.data)

        • curr :=curr.next

      • 그렇지 않으면

        • nxt :=nxt.prev

  • 발견된 것이 False이면

    • "찾을 수 없음" 표시

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

class ListNode:def __init__(self, data):self.data =data self.prev =None self.next =Nonedef insert(head, data):node =ListNode(0) node.data =data node.next =node.prev =None if (head ==None):(head) =node else :node.next =head head.prev =node head =node return headdef get_pair_prod(head, x):curr =head nxt =head while (nxt.next !=없음):nxt =nxt.next 발견 =False 동안 (curr !=없음 및 nxt !=없음 및 curr !=nxt 및 nxt.next !=curr) :if ((curr.data * nxt .data) ==x) :find =True print("(", curr.data, ", ", nxt.data, ")") curr =curr.next nxt =nxt.prev else :if ((curr.data) data * nxt.data)  

입력

<예비>헤드 =없음헤드 =인서트(헤드, 9)헤드 =인서트(헤드, 8)헤드 =인서트(헤드, 6)헤드 =인서트(헤드, 5)헤드 =인서트(헤드, 4)헤드 =인서트(헤드 , 2)머리 =삽입(머리, 1)x =8

출력

( 1 , 8 )( 2 , 4 )