zoukankan      html  css  js  c++  java
  • 单链表相关的面试题

    #pragma once
    #include"List.h"
    
    //1.逆序打印单链表
    template<class T>
    void List<T>::PrintTailToHead(Node * pHead)
    {
        if (pHead == NULL)
            return;
        PrintTailToHead(pHead->_next);
        cout << pHead->_value << " -> ";
    }
    
    //2.删除无头节点的单链表的非尾节点
    template<class T>
    void List<T>::DelNonTailNode(Node * pos)
    {
        assert(pos && pos->_next);
        Node* tmp = pos->_next;
        pos->_value = tmp->_value;
        pos->_next = tmp->_next;
        delete tmp;
    }
    
    //3.无头单链表某一节点前插入一个节点
    template<class T>
    void List<T>::InsertFrontNode(Node* pos, T x)
    {
        assert(pos);
        Node* tmp = new Node(x);
        tmp->_next = pos->_next;
        pos->_next = tmp;
        swap(pos->_value, tmp->_value);
    }
    
    
    //4.逆置单链表
    template<class T>
    void List<T>::ReverseList()
    {
        Node* cur = _head, *new_head = NULL, *tmp;
        while (cur)
        {
            tmp = cur;
            cur = cur->_next;
            tmp->_next = new_head;
            new_head = tmp;
        }
        _head = new_head;
    }
    
    //5.单链表的冒泡排序
    template<class T>
    void List<T>::BubbleSortOfList()
    {
        if (_head == NULL || _head->_next == NULL)
            return;
        Node* tail = NULL,*cur;
        bool sign = true;
        while (tail != _head && sign)
        {
            Node* tmp = NULL;
            cur = _head;
            while (cur->_next != tail)
            {
                if (cur->_value > cur->_next->_value)
                {
                    swap(cur->_value, cur->_next->_value);
                    tmp = cur;
                }
                cur = cur->_next;
            }
            tmp == NULL ? sign = false : tail = cur;;
        }
    }
    
    //6.中间节点
    template<class T>
    ListNode<T>* List<T>::MiddleOfList()
    {
        if (_head == NULL || _head->_next == NULL)
            return NULL;
        Node* fast = _head, *slow = _head;
        while (fast && fast->_next)
        {
            slow = slow->_next;
            fast = fast->_next->_next;
        }
        return slow;
    }
    
    //7.单链表中的倒数第 k 个节点
    template<class T>
    ListNode<T>* List<T>::ReciprocalK(int k)
    {
        if (_head == NULL)
            return NULL;
        Node* tmp = _head, *result = _head;
        while (k--)
        {
            tmp = tmp->_next;
            if (tmp == NULL)
                return (k == 0 ? _head : NULL);
        }
        while (tmp)
        {
            result = result->_next;
            tmp = tmp->_next;
        }
        return result;
    }
    
    //8.判断一个链表是否带环,如果带环求出环的长度以及入口点
    template<class T>
    ListNode<T>* List<T>::IsRingList()
    {
        if (_head == NULL)
            return false;
        Node* fast = _head,* slow = _head,* Input;
        while (fast && fast->_next)
        {
            if (fast == slow)     //链表带环 输出环的长度和入口点
            {
                int count = 1;
                do
                {
                    slow = slow->_next;
                    fast = fast->_next->_next;
                    ++count;
                } while (fast == slow);
                cout << "环的节点的个数为:" << count << endl;
    
                while (Input == slow)
                {
                    Input = Input->_next;
                    slow = slow->_next;
                }
                return Input;
            }
        }
        return NULL;
    }
    
    //9.判断两个链表是否相交,如果相交求出交点(不带环)
    template<class T>
    ListNode<T>* List<T>::IsCross(const List<T>& List1, const List<T>& List2)
    {
        Node* Tmp1 = List1._head, Tmp2 = List2._head;
        int Length1 = 0, Length2 = 0;
        while (Tmp1)
        {
            Length1++;
            Tmp1 = Tmp1->_next;
        }
        while (Tmp2)
        {
            Length2++;
            Tmp2 = Tmp2->_next;
        }
    
        Tmp1 = List1._head, Tmp2 = List2._head;   /*重新指向链表的头*/
        int n = abs(Length1 - Length2);
        if (Length1 > Length2)        /*如果链表一 长于 链表二*/
        {
            while (n--)
            {
                Tmp1 = Tmp1->_next;
            }
        }
        else                          /*如果链表二 长于 链表一*/
        {
            while (n--)
            {
                Tmp2 = Tmp2->_next;
            }
        }
    
        while (Tmp1)
        {
            if (Tmp1 == Tmp2)
                return Tmp1;        /*找到了交点,返回*/
            else
            {
                Tmp1 = Tmp1->_next;
                Tmp2 = Tmp2->_next;
            }
        }
        return NULL;                /*没找到,NULL 返回*/
    }
    
    
    //10.判断两个链表是否相交,如果相交求出交点(不确定带不带环)
    template<class T>
    ListNode<T>* List<T>::IsCrossStrengthen(const List<T>& List1, const List<T>& List2)
    {
        Node* Cross1 = List1.IsRingList(), *Cross2 = List2.IsRingList();
        if (Cross1 == NULL && Cross2 == NULL)   /*两个链表均不带环*/
            return List1.IsCross(List1, List2);
        else if (Cross1 && Cross2)   /*两个均代环*/
        {
            if (Cross1 == Cross2)
                return Cross1;
            Node* tmp = Cross1->_next;
            while (tmp != Cross1)
            {
                if (Cross1 == Cross2)
                    return Cross1;
                tmp = tmp->_next;
            }
        }
        return false;    /*一个链表带环,一个不带环*/
    }
    单链表的面试题
  • 相关阅读:
    Centos7安装JDK+部署Tomcat8
    blog开发day3+Django admin的简单使用
    基于form组件的注册 + 基于Ajax的注册
    form组件复习+文件上传
    登录验证+验证码
    Django认证系统--Auth模块
    中间件
    form组件
    Ajax
    自定义分页 Cookie Session和获得路径
  • 原文地址:https://www.cnblogs.com/shihaochangeworld/p/5572857.html
Copyright © 2011-2022 走看看