zoukankan      html  css  js  c++  java
  • 单链表类,链表逆置

     1 #pragma once
     2 #include"iostream"
     3 #include <cstdlib>
     4 #include <time.h>
     5 using namespace std;
     6  
     7 struct Node
     8 {
     9     int val;
    10     Node *next;
    11     Node(int nVal, Node *nNext = NULL) {
    12         val = nVal;
    13         next = nNext;
    14     }
    15     Node() {}
    16 };
    17  
    18 class ListNode
    19 {
    20 private:
    21     Node *head;  //声明头节点
    22     int counts;
    23  
    24 public:
    25     ListNode();
    26     ~ListNode();
    27     void CreateList(int n);
    28     void CreateListByPC(int n,int randnum);
    29     ListNode* Reverse();
    30     ListNode* ReverseBetween(int m, int n);
    31     void ShowList();
    32     int ListLength();
    33     void InsertNode(int position, int value);
    34     void DeleteNode(int position);
    35     Node *GetNodeByPosition(int position);
    36 };[/align]
    37 [align=center]
    38 [size=6][color=#48d1cc]源文件[/color][/size]

    实现文件如下:

    #include "ListNode.h"
     
     
    ListNode::ListNode()
    {
        head = new Node;
        head->next = NULL;
        head->val = 0;
    }
     
    ListNode::~ListNode()
    {
        Node * temp = head; //创建一个临时变量保存删除节点信息
        while(head->next){
            temp = head->next;
            delete head;
            head = temp;
        }
        delete head;
        cout << "该链表析构完成..." << endl;
    }
     
    void ListNode::CreateList(int n)
    {
        cout << "正在创建长度为" << n << "的链表......" << endl;
        Node *preNode = head;
        for (int i = 0; i < n; i++)
        {
            Node *newNode = new Node;
            cout << "请输入该节点的值: ";
            cin >> newNode->val;
            newNode->next = NULL;
            preNode->next = newNode;
            preNode = newNode;
        }
    }
     
    void ListNode::CreateListByPC(int n, int randnum)
    {
        cout << "正在创建长度为" << n << "的链表,其值范围为:" << randnum << endl;
        srand((unsigned int)time(NULL));
        Node *preNode = head;
        for (int i = 0; i < n; i++)
        {
            Node *newNode = new Node;
            newNode->val = rand()%randnum;
            newNode->next = NULL;
            preNode->next = newNode;
            preNode = newNode;
        }
    }
     
    ListNode * ListNode::Reverse()
    {
        cout << "正在逆置链表..." << endl;
        Node *newHead = NULL;           //临时变量,遍历新链表
        Node *vNode = head->next;        //取第一个节点开始遍历
        while (vNode!=NULL)
        {
            Node *temp = vNode->next;    //备份原链表的下一个节点信息
            vNode->next = newHead;       //当前节点的指针域修改
            newHead = vNode;
            vNode = temp;
        }
        head->next = newHead;
        return NULL;
    }
     
    ListNode * ListNode::ReverseBetween(int m,int n)
    {
        if (m <= 0 || n >= this->counts)
            return false;
        Node *temp = head;              //临时变量保存头节点
        int changeLength = n - m + 1;   //获取需要逆置的个数
     
        while (--m)
        {
            temp = temp->next;
        }
     
        Node *preNode = temp;       //找到m节点的前置节点
        temp = temp->next;
        Node *changeTail = temp;    //m节点,即需要改变的尾节点
        Node *newHead = NULL;
         
     
        cout << "changeLength = " << changeLength << endl;
     
        int i = 0;
        while (changeLength--)
        {
            cout << "正在执行第" << ++i << "ci" << endl;
            Node *vNode = temp->next;    //备份下一个节点的信息
            temp->next = newHead;
            newHead = temp;
            temp = vNode;
        }
     
        preNode->next = newHead;
        changeTail->next = temp;
        return NULL;
    }
     
    void ListNode::ShowList()
    {
        Node *tempNode = head;
        while (tempNode->next)
        {
            cout << tempNode->next->val <<"	";
            tempNode = tempNode->next;
        }
        cout << endl << "该链表已显示完毕..." << endl;
    }
     
    int ListNode::ListLength()
    {
        Node *temp = head;
        for (; temp->next != NULL; temp = temp->next)
            counts++;
        return counts;
    }
     
    void ListNode::InsertNode(int position, int value)
    {
        Node *temp = this->GetNodeByPosition(position - 1);
        Node *newNode = new Node(value);
        newNode->next = temp->next;
        temp->next = newNode;
    }
     
    void ListNode::DeleteNode(int position)
    {
        if (position<1 || position>this->ListLength())
            return;
        Node *temp = this->GetNodeByPosition(position - 1);
        Node *delNode = temp->next;
        temp->next = delNode->next;
        delete delNode;
    }
     
    Node * ListNode::GetNodeByPosition(int position)
    {
        if (position<1 || position>this->ListLength())
            return flase;
     
        Node *temp = head;
        for (int i = 0; i < position; i++)
            temp = temp->next;
        return temp;
    }
    

      

  • 相关阅读:
    iOS 怎么在一个函数执行完毕得到某个参数值后再去执行他下边的代码
    微信小程序开发(三)-----手动创建目录结构
    微信小程序开发(二)-----项目的创建
    微信小程序开发(一)-----工具的安装
    Block传值讲解与使用
    Mybatis xml约束文件的使用
    Spark Streaming 整合 Kafka
    Scala 大数据 常用算法收集
    WPF自定义动画控件 风机
    wpf 错误 执行了 QueryInterface 调用,请求提供 COM 可见的托管类“BoilerMonitoringV1._0.MapControl”的默认 IDispatch 接口。
  • 原文地址:https://www.cnblogs.com/cyhezt/p/10426857.html
Copyright © 2011-2022 走看看