Skip to content

Latest commit

 

History

History
executable file
·
193 lines (168 loc) · 5.63 KB

File metadata and controls

executable file
·
193 lines (168 loc) · 5.63 KB

题目

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

References

方法2:使用3个指针遍历单链表,逐个链接点进行反转。

方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。

    p=head->next;  
    while(p->next!=NULL){  
        q=p->next;  
        p->next=q->next;  
        q->next=head->next;  
        head->next=q;  
    }  

方法4: 递归(相信我们都熟悉的一点是,对于树的大部分问题,基本可以考虑用递归来解决。但是我们不太熟悉的一点是,对于单链表的一些问题,也可以使用递归。可以认为单链表是一颗永远只有左(右)子树的树,因此可以考虑用递归来解决。或者说,因为单链表本身的结构也有自相似的特点,所以可以考虑用递归来解决)

struct ListNode{  
    int val;  
    ListNode* next;  
    ListNode(int a):val(a),next(NULL){}  
};  
  
class Solution{  
     ListNode* reverseLinkedList4(ListNode* head){ //输入: 旧链表的头指针  
        if(head==NULL)  
            return NULL;  
        if(head->next==NULL){  
            m_phead=head;  
            return head;  
        }  
        ListNode* new_tail=reverseLinkedList4(head->next);  
        new_tail->next=head;  
        head->next=NULL;  
        return head; //输出: 新链表的尾指针  
     }  
    ListNode* m_phead=NULL;//member variable defined for reverseLinkedList4(ListNode* head)  
};  
struct ListNode{  
    int val;  
    ListNode* next;  
    ListNode(int a):val(a),next(NULL){}  
};  
  
class Solution{  
    ListNode* reverseLinkedList5(ListNode* head, ListNode* & new_head){ //输入参数head为旧链表的头指针。new_head为新链表的头指针。  
        if(head==NULL)  
            return NULL;  
        if(head->next==NULL){  
            new_head=head; //当处理到了旧链表的尾指针,也就是新链表的头指针时,对new_head进行赋值。因为是引用型参数,所以在接下来调用中new_head的值逐层传递下去。  
            return head;  
        }  
        ListNode* new_tail=reverseLinkedList5(head->next,new_head);  
        new_tail->next=head;  
        head->next=NULL;  
        return head; //输出参数head为新链表的尾指针。  
    }  
};  

我的解法:

# -*- coding:utf-8 -*-
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def printListNode(head):
    while head!=None:
        print head.val
        head = head.next

class Solution3:
    # 返回ListNode
    def ReverseList(self, pHead):
        if pHead == None or pHead.next == None:
            return pHead
        newNode = pHead.next
        while newNode.next != None:
            tmp = newNode.next
            newNode.next = tmp.next
            #print "newNode.next",newNode.next.val
            tmp.next = pHead.next
            #print "tmp.next",tmp.next.val
            pHead.next = tmp
            print 'pHead'
            printListNode(pHead)
            # print 'newNode'
            # printListNode(newNode)

        newNode.next = pHead
        #print '闭环',newNode.val

        pHead = newNode.next.next
        #print '新头变成原头的next',pHead.val

        newNode.next.next = None 
        #print '解环',newNode.next.val
        
        printListNode(pHead)
        return pHead
class Solution2:
    # 返回ListNode
    def ReverseList(self, pHead):
        if pHead == None or pHead.next == None:
            return pHead
        p = pHead
        r = pHead.next  #指向待搬运的结点(从第二个开始到最后一个)
        m = None    # 搬运工
        tail = pHead.next
        while r!= None:
            m = r
            r = r.next
            m.next = p.next
            p.next = m
            pHead = p.next
        tail.next = p
        p.next = None
        tail = p
        return pHead
class Solution4:
    def ReverseList(self, pHead):
        if pHead == None:
            return None
        if pHead.next == None:
            self.m_pHead = pHead
            return pHead    #????
        new_tail = self.ReverseList(pHead.next)
        new_tail.next = pHead
        pHead.next = None
        return pHead   #最后一次,pHead是尾指针
        
    def ReverseList2(self,pHead,new_head):
        if pHead == None:
            return None
        if pHead.next == None:
            new_head = pHead
            return pHead
        new_tail = self.ReverseList2(pHead.next,new_head)
        new_tail.next = pHead
        pHead.next = None
        return pHead
def main():
    listNode1 = ListNode(10)
    listNode2 = ListNode(8)
    listNode3 = ListNode(5)
    listNode4 = ListNode(2)
    listNode1.next = listNode2
    listNode2.next = listNode3
    listNode3.next = listNode4

    sol3 = Solution3()
    # result3 = sol3.ReverseList(listNode1)
    # #print result.val
    # while result3 != None:
    #     print result3.val
    #     result3 = result3.next
    sol4 = Solution4()
    _ = sol4.ReverseList(listNode1)
    result3 = sol4.m_pHead
    #print result.val
    while result3 != None:
        print result3.val
        result3 = result3.next


    sol4 = Solution4()
    _ = sol4.ReverseList2(listNode1, listNode1)
    result3 = sol4.m_pHead
    #print result.val
    while result3 != None:
        print result3.val
        result3 = result3.next
        

if __name__ == '__main__':
    main()