python 체인 테이블 제목 및 코드 leetcode 및 검지offer

11192 단어
1. 간단하게 조작하기 1. 체인 시계를 입력하고 체인 시계의 값에 따라 끝에서 끝까지의 순서로 Array List를 되돌려줍니다.
class Solution:
    def printListFromTailToHead(self, listNode):
        res=[]
        while listNode:
            res.insert(0,listNode.val)
            listNode=listNode.next
        return res

준비 작업: 체인 시계를 출력하는데 코드를 어떻게 코드합니까?출력 체인 테이블 1->2->3
class ListNode:
    def __init__(self,x):
        self.val=x
        self.next=None

def PrintChain(node):
    while node:
        print node.val
        node=node.next
        
l1=ListNode(1)
l2=ListNode(2)
l3=ListNode(3)
l1.next=l2
l2.next=l3
PrintChain(l1)

2. 체인 테이블을 입력하여 이 체인 테이블의 밑에서 k번째 결점을 출력한다.
class Solution:
    def FindKthToTail(self,head,k):
        firstPoint=head
        secondPoint=head
        for i in range(k):
            if firstPoint==None:
               return None 
            firstPoint=firstPoint.next
        while firstPoint!=None:
            firstPoint=firstPoint.next
            secondPoint=secondPoint.next
        return secondPoint

3. 두 개의 단조로운 체인 테이블을 입력하고 두 개의 체인 테이블을 합성한 체인 테이블을 출력한다. 물론 우리는 합성된 체인 테이블이 단조로운 규칙을 만족시켜야 한다.
class Solution:
    def Merge(self, pHead1, pHead2):
        if pHead1==None:
            return pHead2
        elif pHead2==None:
            return pHead1
        if pHead1.val

2. 반전 체인 테이블(또는 반전 중 일부)과 그 응용 반전 체인 테이블;leetcode206. Reverse Linked List
class Solution:
    def ReverseList(self, pHead):
        pTmp = pHead
        newHead = None
        while pTmp:
            pTmp1 = pTmp.next
            pTmp.next = newHead
            newHead = pTmp
            pTmp = pTmp1
        return newHead

생각이 같다
class Solution:
    #   ListNode
    def ReverseList(self, pHead):
        if pHead == None:
            return None
        pTmp = pHead
        pTmp1 = pHead.next
        newHead = None
        while pTmp:
            pTmp.next = newHead
            newHead = pTmp
            pTmp = pTmp1
            if pTmp1:
                pTmp1 = pTmp1.next
        return newHead

leetcode92. Reverse Linked List II 체인 테이블의 일부를 대칭 이동합니다.
class Solution:
    def reverseBetween(self, head, m, n):
        dummy = ListNode(0)   #  :          
        dummy.next = head
        p1 = dummy
        for i in range(m-1):
            p1 = p1.next
        p2 = p1.next
        newhead = None
        for i in range(n-m+1): #  m n  
            p3 = p2.next
            p2.next = newhead
            newhead = p2
            p2 = p3
        p1.next.next = p2
        p1.next = newhead
        return newhead if p1 == dummy else head

letcode25. Reverse Nodes in k-Group
class Solution:
    def reverseKGroup(self, head, k):
        i = 0
        p = head
        p1 = head
        while p and i

leetcode234. Palindrome Linked List 1->2->2->1 True
#            ,      O(1),             ,      
#        ;    O(1):        ,         
class Solution:
    def isPalindrome(self, head):
        fastp = slowp = head   #         
        while fastp and fastp.next and slowp:
            fastp = fastp.next.next
            slowp = slowp.next
        newhead = None
        while slowp:   #       ,     newhead
            p1 = slowp.next
            slowp.next = newhead
            newhead = slowp
            slowp = p1
        while newhead and head.val == newhead.val:   #    
            head = head.next
            newhead = newhead.next
        if newhead == None:
            return True
        else:
            return False

3. 체인표에 링leetcode141이 있는지 판단한다.Linked List Cycle에서 루프 여부를 판단합니다.
class Solution(object):
    def hasCycle(self, head):
        fastp = slowp = head
        while fastp and fastp.next:
            fastp = fastp.next.next
            slowp = slowp.next
            if fastp == slowp:
                return True
        return False

leetcode142. Linked List Cycle II, 검지는offer 체인 테이블의 링의 입구 노드를 가리킨다. 체인 테이블에 링이 포함되어 있으면, 이 체인 테이블의 링의 입구 결점을 찾아내십시오. 그렇지 않으면 null을 출력합니다.
#            a,              b,   n
#   2*(a+b)=a+b+k*n, a+b=k*n。         ,      
#         ,       ,          ,  a+b 
# n    
class Solution(object):
    def detectCycle(self, head):
        fastp = slowp = head
        while fastp and fastp.next:
            fastp = fastp.next.next
            slowp = slowp.next
            if fastp == slowp:
                slowp = head
                break
        if fastp == None or fastp.next == None:
            return None
        else:
            while slowp != fastp:
                fastp = fastp.next
                slowp = slowp.next
            return slowp

class Solution:
    def EntryNodeOfLoop(self, pHead):
        fastp = slowp = pHead
        while fastp and fastp.next:
            fastp = fastp.next.next
            slowp = slowp.next
            if fastp == slowp:
                slowp = pHead
                break
        if fastp == None or fastp.next == None:
            return None
        else:
            while slowp != fastp:
                fastp = fastp.next
                slowp = slowp.next
            return slowp

4. 단방향 체인 시계는 교차점을 찾는다.Intersection of Two Linked Lists는 두 개의 체인 테이블을 입력하여 첫 번째 공통 결점을 찾습니다.법1:
#       next,         ,   next,      
class Solution(object):
    def getIntersectionNode(self, headA, headB):
        lenA = lenB = 0   #  A   lenA B   lenB
        pA = headA
        pB = headB
        while pA:  
            pA = pA.next
            lenA += 1
        while pB:
            pB = pB.next
            lenB += 1
        pA = headA
        pB = headB
        while lenA > lenB:   #   next      
            pA = pA.next
            lenA -= 1
        while lenB > lenA:
            pB = pB.next
            lenB -= 1

        while pA != pB:
            pA = pA.next
            pB = pB.next
        return pA

다음은 검지offer 상응하는 문제 코드입니다.
class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        pTmp1=pHead1
        pTmp2 = pHead2
        while pTmp1 and pTmp2:
            pTmp1=pTmp1.next
            pTmp2=pTmp2.next
        if pTmp1:
            k = 0
            while pTmp1:
                pTmp1 = pTmp1.next
                k += 1
            pTmp1=pHead1
            pTmp2=pHead2
            for i in range(k):
                pTmp1=pTmp1.next
        else:
            k=0
            while pTmp2:
                pTmp2 = pTmp2.next
                k += 1
            pTmp2=pHead2
            pTmp1=pHead1
            for i in range(k):
                pTmp2=pTmp2.next
        
        while pTmp1 != pTmp2:
            pTmp1=pTmp1.next
            pTmp2=pTmp2.next
        return pTmp1

법2: 함수를 호출하여 두 가지 상황을 호출한다
class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        pTmp1 = pHead1
        pTmp2 = pHead2
        while pTmp1 and pTmp2:
            pTmp1 = pTmp1.next
            pTmp2 = pTmp2.next
            
        def findequal(longchain,shortchain, longhead, shorthead):
            k=0
            while longchain:
                longchain=longchain.next
                k += 1
                
            longchain = longhead
            shortchain = shorthead
            for i in range(k):
                longchain=longchain.next
                
            while longchain != shortchain:
                longchain=longchain.next
                shortchain=shortchain.next
            return longchain
        if pTmp1:
            return findequal(pTmp1,pTmp2,pHead1,pHead2)
        else:
            return findequal(pTmp2,pTmp1,pHead2,pHead1)

5. 복수 random 지침leetcode138.Copy List with Random Pointer
class Solution(object):
    def copyRandomList(self, head):
        if head == None:
            return None
        p = head
        while p:  #              
            node = Node(p.val, p.next, p.random)
            node.next = p.next
            p.next = node
            p = node.next
        p = head
        while p: # random    
            if p.random:
                p.next.random = p.random.next
            p = p.next.next
        p = head
        newhead = p.next
        p1 = newhead
        while p and p1.next:   #      
            p.next = p1.next
            p = p.next
            p1.next = p.next
            p1 = p1.next
        p.next = None
        p1.next = None
        return newhead


대응하는 검지offer 제목: 하나의 복잡한 체인 테이블(각 노드에 노드 값이 있고 두 개의 바늘이 있는데 하나는 다음 노드를 가리키고 다른 특수한 바늘은 임의의 노드를 가리킨다)을 입력하면 복사 후 복잡한 체인 테이블의head로 되돌아온다.(출력 결과에서 매개 변수의 노드 인용을 되돌려주지 마십시오. 그렇지 않으면 판정 프로그램이 바로 비어 있습니다.) 방법 1:
import copy
class Solution:
    #    RandomListNode
    def Clone(self, pHead):
        # write code here
        ret=copy.deepcopy(pHead)
        return ret

방법2:
class Solution:
    #    RandomListNode
    def Clone(self, pHead):
        # write code here
        if pHead == None:
            return None
        pTmp = pHead
        while pTmp:
            node = RandomListNode(pTmp.label)
            node.next = pTmp.next
            pTmp.next = node
            pTmp = node.next

        pTmp = pHead
        while pTmp:
            if pTmp.random:
                pTmp.next.random = pTmp.random.next
            pTmp = pTmp.next.next

        pTmp = pHead
        pTmp1 = pHead.next
        newhead = pHead.next
        while pTmp:
            pTmp.next = pTmp.next.next
            pTmp=pTmp.next
            if pTmp1.next:
                pTmp1.next = pTmp1.next.next
            pTmp1=pTmp1.next
        return newhead

주:pycharm 디버깅을 하려면
if __name__ == "__main__":
    n1=RandomListNode(1)
    n2 = RandomListNode(2)
    n3 = RandomListNode(3)
    n4 = RandomListNode(4)
    n1.next = n2
    n2.next = n3
    n3.next = n4
    s=Solution()
    newhead = s.Clone(n1)
    tmp = newhead
    while tmp:
        print tmp.label
        tmp = tmp.next

** 6, 체인 테이블 partition ** leetcode 86.Partition List: 체인 테이블에 정수를 저장하고 x를 주고 x보다 작은 노드를 >=x 앞에 두기
#  :        , x    leftp  ,    rightp  ,      
class Solution:
    def partition(self, head, x):
        dummyleft = ListNode(0)
        dummyright = ListNode(0)
        leftp = dummyleft
        rightp = dummyright
        p = head
        while p:
            if p.val < x:
                leftp.next = p
                leftp = leftp.next
            else:
                rightp.next = p
                rightp = rightp.next
            p = p.next
        rightp.next = None
        leftp.next = dummyright.next
        return dummyleft.next 

좋은 웹페이지 즐겨찾기