• 单向链表操作


    简介

    链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

    本文通过c++代码形式简单的实现了单向链表的增加节点,删除节点,打印链表,和销毁链表操作。

    c++示例代码

      1 #include <iostream>
      2 
      3 using namespace std;
      4 
      5 //单链表节点
      6 struct ListNode {
      7     //节点存储的数字
      8     int m_nValue;
      9     //下一个节点的指针
     10     ListNode* m_pNext;
     11 };
     12 
     13 /************************************************************************/
     14 /* @brif 在链表结尾增加节点
     15 /* @param pHead 链表头结点
     16 /* @param value 要增加的节点值
     17 /************************************************************************/
     18 void AddNodeToTail(ListNode** pHead, int value)
     19 {
     20     ListNode *addNode = new ListNode;
     21 
     22     if (!addNode)
     23     {
     24         cout << "add node fail!!!" << endl;
     25         return;
     26     }
     27     addNode->m_nValue = value;
     28     addNode->m_pNext = nullptr;
     29 
     30     //头结点为空的情况,新增加的节点作为头结点
     31     if (!*pHead)
     32     {
     33         *pHead = addNode;
     34     }
     35     //头结点不为空的情况,查找到最后一个节点,修改最后一个节点的指向
     36     else
     37     {
     38         ListNode* tmpNode = *pHead;
     39         //找到最后一个头结点
     40         while (tmpNode->m_pNext)
     41         {
     42             tmpNode = tmpNode->m_pNext;
     43         }
     44         tmpNode->m_pNext = addNode;
     45     }
     46 }
     47 
     48 /************************************************************************/
     49 /* @brif 删除链表中的其中一个节点
     50 /* @param pHead 链表头结点
     51 /* @param value 要删除的节点值
     52 /************************************************************************/
     53 void removeNode(ListNode** pHead, int value)
     54 {
     55     ListNode* currNode = *pHead;    
     56 
     57     cout << "删除节点" << value << endl;
     58     if (!currNode)
     59     {
     60         cout << "空链表" << endl;
     61     }
     62 
     63     //删除头结点
     64     if (currNode ->m_nValue == value)
     65     {
     66         *pHead = currNode->m_pNext;
     67         delete currNode;
     68         return;
     69     }
     70 
     71     //查找要删除的节点
     72     while (currNode->m_pNext && currNode->m_pNext->m_nValue != value)
     73     {
     74         currNode = currNode->m_pNext;
     75     }
     76 
     77     //找到最后一个都没找到这个节点
     78     if (!currNode->m_pNext)
     79     {
     80         cout << "没找到要删除的节点" << endl;
     81     }
     82     //找到了要删除的节点,修改节点指针,释放内存
     83     else
     84     {
     85         ListNode* delNode = currNode->m_pNext;
     86         currNode->m_pNext = currNode->m_pNext->m_pNext;
     87         delete delNode;
     88     }
     89 }
     90 
     91 /************************************************************************/
     92 /* @brif 删除链表中的所有节点
     93 /* @param pHead 链表头结点
     94 /************************************************************************/
     95 void removeAllNode(ListNode** pHead)
     96 {
     97     ListNode* currNode = *pHead;
     98 
     99     if (!*pHead)
    100     {
    101         cout << "空链表" << endl;
    102     }
    103 
    104     ListNode* delNode = nullptr;
    105     while ((*pHead)->m_pNext)
    106     {
    107         delNode = (*pHead);
    108         (*pHead) = (*pHead)->m_pNext;
    109         delete delNode;
    110         delNode = nullptr;
    111     }
    112     delete (*pHead);
    113     *pHead = nullptr;
    114 }
    115 
    116 /************************************************************************/
    117 /* @brif 打印链表中的节点
    118 /* @param pHead 链表头结点
    119 /************************************************************************/
    120 void printLinkList(ListNode* pHead)
    121 {
    122     ListNode* currNode = pHead;
    123 
    124     if (!currNode)
    125     {
    126         cout << "空链表" << endl;
    127     }
    128 
    129     while (currNode)
    130     {
    131         cout << currNode->m_nValue << "->";
    132         currNode = currNode->m_pNext;
    133     }
    134     cout << "结束" << endl;
    135 }
    136 
    137 int main()
    138 {
    139     ListNode* pHead = nullptr;
    140 
    141     cout << "从空连表中依次在尾部插入10个值:" << endl;
    142     //空链表中依次插入10个值
    143     for (int i = 1; i <= 10; ++i)
    144     {
    145         AddNodeToTail(&pHead, i);
    146         printLinkList(pHead);
    147     }
    148     
    149     //删除节点1
    150     removeNode(&pHead, 1);
    151     printLinkList(pHead);
    152 
    153     //删除节点10
    154     removeNode(&pHead, 10);
    155     printLinkList(pHead);
    156 
    157     //删除节点5
    158     removeNode(&pHead, 5);
    159     printLinkList(pHead);
    160 
    161     //删除不存在的节点11
    162     removeNode(&pHead, 11);
    163     printLinkList(pHead);
    164 
    165     //清理现场释放内存
    166     removeAllNode(&pHead);
    167 
    168     cout << endl;
    169     return 0;
    170 }

    测试结果

  • 相关阅读:
    定义和使用EL函数
    在Java Web程序中使用Hibernate
    JDBC在Java Web中的应用——分页查询
    JDBC调用存储过程
    使用navicat工具创建MySQL存储过程
    JDBC操作数据库的批处理
    JDBC操作数据库
    Servlet监听器统计在线人数
    Servlet字符编码过滤器
    Servlet过滤器创建与配置
  • 原文地址:https://www.cnblogs.com/huangwenhao/p/11176583.html
Copyright © 2020-2023  润新知