单链表的反转和归并操作

1、输入一个链表,反转链表后,输出链表的所有元素。

2、输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
class Node():
    __slots__=['_elem','_next']#限定Node实例的属性
    def __init__(self,elem,next1=None):
        self._elem=elem
        self._next=next1#Node的指针部分默认指向None
        
class SingleLinkedList():
    def __init__(self):#初始化为空链表
        self._head=None
        
    def append2(self,elem):#在链表后端添加元素
        if self._head is None:
            self._head=Node(elem)
            return#这里很重要,如果不写,会多一个
        p=self._head
        while p._next:
            p=p._next
        p._next=Node(elem)
     
    def ReverseList(self, pHead):#反转链表,注意last
        if pHead==None:
            return None
        if pHead and pHead._next==None:
            return pHead
        last=None
        while pHead:
            tmp = pHead._next
            pHead._next=last
            last = pHead
            pHead = tmp
        return last
    
    def merge1(self, pHead1, pHead2):#offer-17递归合并
            p=None
            if pHead1==None:
                return pHead2
            if pHead2==None:
                return pHead1
            if pHead1._elem>pHead2._elem:
                p=pHead2
                p._next=SingleLinkedList().merge1(pHead1,pHead2._next)
            else:
                p=pHead1
                p._next=SingleLinkedList().merge1(pHead1._next,pHead2)
            return p
    
    def merge2(self,phead1,phead2):#非递归合并
        p=Node(90)#在这儿多加一个头结点,比较好存储
        q=p
        while phead1 and phead2:
            if phead1._elem>phead2._elem:
                p._next=phead2
                phead2=phead2._next
            else:
                p._next=phead1
                phead1=phead1._next
            p=p._next
        if phead1==None:
            p._next=phead2
        elif phead2==None:
            p._next=phead1
        return q._next
            
a=SingleLinkedList()
for i in range(1,4):
    a.append2(2*i-1)

b=SingleLinkedList()
for j in range(1,4):
    b.append2(2*j) 
    
#1、反转test   
print (a.ReverseList(a._head)._elem)
#2、归并
c=SingleLinkedList().merge1(a._head,b._head)
while c:
    print (c._elem)
    c=c._next

猜你喜欢

转载自blog.csdn.net/petoilej/article/details/80327485