zoukankan      html  css  js  c++  java
  • 剑指offer-第三章高质量代码(反转链表)

    题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转链表的头节点。

    思路:对一个链表反转需要三个指针操作来保证链表在反转的过程中保证不断链,给链表一个行动指针pNode,对pNode指向的节点进行反转就是让它指向的下一个节点,变成指向上一个节点,因此我们要用一个指针pre来指向上一个节点。用pNext来保存pNode->m_pNext.避免在进行反转操作时,断链(如下图所示,对i进行反转)。

    C++代码:

    #include<iostream>
    using namespace std;
    struct ListNode
    {
        int m_nValue;
        ListNode* m_pNext;
    };
    ListNode* createList(int a[],int k)
    {
        ListNode* pHead=NULL,*pNode=NULL;
        for(int i=0;i<k;i++)
        {
            ListNode* pNew=new ListNode();
            pNew->m_nValue=a[i];
            pNew->m_pNext=NULL;
            if(pHead==NULL)
            {
                pHead=pNew;
                pNode=pNew;
            }
            else
            {
                pNode->m_pNext=pNew;
                pNode=pNode->m_pNext;
            }
        }
        return pHead;
    }
    void printList(ListNode* pHead)
    {
        ListNode* p=pHead;
        while(p!=NULL)
        {
            cout<<p->m_nValue<<" ";
            p=p->m_pNext;
        }
        cout<<endl;
    }
    //递归实现 
    //注意判断oldList!=NULL的情况 
    ListNode *reverse(ListNode *oldList,ListNode *newHead=NULL) 

        if(oldList!=NULL) 
        { 
            ListNode *next=oldList->m_pNext;//记录上次反转后的链表 
            oldList->m_pNext=newHead;//将当前节点插入到翻转后链表的开头 
            newHead=oldList;//递归处理剩余的链表 
            return (next==NULL)?newHead:reverse(next,newHead); 
        } 
        return NULL; 
    ListNode
    *ReverseList(ListNode * pHead) { ListNode *pReversedHead=NULL; ListNode *pNode=pHead; ListNode *pPrev=NULL; if(pHead==NULL) return NULL; while(pNode!=NULL) { ListNode *pNext=pNode->m_pNext; if(pNext==NULL) pReversedHead=pNode; pNode->m_pNext=pPrev; pPrev=pNode; pNode=pNext; } return pReversedHead; } void main() { int a[]={1,2,3,4,5}; ListNode* pHead=createList(a,5); printList(pHead); ListNode* pReversedHead=ReverseList(pHead); printList(pReversedHead); }

    Java代码:

    public class ReverseLink {
    
        public  static class ListNode
        {
            public int m_nValue;
            public ListNode m_pNext;
        }
        //创建链表
        public  static ListNode CreateLink(int a[],int k)  
        {  
            ListNode Head=null,q=null;  
            for(int i=0;i<k;i++)  
            {  
                ListNode  pNew=new ListNode();  
                pNew.m_nValue=a[i];  
                pNew.m_pNext=null;  
                if(Head==null)  
                {  
                    Head=pNew;  
                    q=pNew;  
                }  
                else 
                {  
                    q.m_pNext=pNew;  
                    q=q.m_pNext;
                }  
    
            }  
            return Head;  
        }  
        //从头到尾打印列表  
        public static  void printLink(ListNode pHead)  
        {  
            ListNode p=pHead;  
            while(p != null)  
            {  
                System.out.print(p.m_nValue+" ");
                p=p.m_pNext;  
            }  
            System.out.println("
    ");
        }  
        //反转链表
        public static ListNode reverseList(ListNode pHead)
        {
            ListNode  pReversedHead=null;
            ListNode  pNode=pHead;
            ListNode  pre=null;
            if(pHead==null)
                return null;
            
            while(pNode!=null)
            {
                ListNode pNext=pNode.m_pNext;
                if(pNode.m_pNext==null)
                   pReversedHead=pNode;
                pNode.m_pNext=pre;
                pre=pNode;
                pNode=pNext;
            }
            return pReversedHead;
        }
        public static void main(String[] args)  
    
        {  
            int a[]={1,2,3};  
            ListNode  Head=CreateLink(a,3);  
            printLink(Head);  
            ListNode pReversedHead=reverseList(Head);
            printLink(pReversedHead);
        } 
        
    
    }
  • 相关阅读:
    嵌入式框架Zorb Framework搭建五:事件的实现
    C#网络编程系列文章(五)之Socket实现异步UDP服务器
    C#SocketAsyncEventArgs实现高效能多并发TCPSocket通信 (服务器实现)
    C#中的ManagementClass类
    Etcd v3备份与恢复
    kubernetes调度重平衡工具 Descheduler
    K8S – 优化dns解析时间
    kubernetes备份和恢复
    Coredns部署更新
    认识Kubernetes Descheduler
  • 原文地址:https://www.cnblogs.com/hupp/p/4572312.html
Copyright © 2011-2022 走看看