链表操作大总结!!!


参考左神上课所讲内容,所使用语言为C++

1.单链表的基本操作

包含单链表的创建(头插法,尾插法),链表打印,删除链表结点等操作,要注意边界条件

list.h

#ifndef _LIST_H_
#define _LIST_H_

#include <iostream>
using namespace std;

typedef int ElementType;//数据类型

class Node{
   
public:
    Node(){
   next = NULL;}
    ElementType data;
    Node* next;
};

class List{
   
public:
    List();
    virtual ~List();

    /*链表相关操作*/
    void insertHead(ElementType data);//头插法
    void insertTail(ElementType data);//尾插法
    bool insertNext(Node* node,ElementType data);//把数据插入到结点node的后面
    bool deleteNode(Node* node);//删除结点
    
    void displayList();//从头打印链表元素
    void reverse();//反转链表
    Node* Find(int num);//返回第num个结点
    Node* Search(ElementType data);//查找数据为data的结点

    /*获取链表长度和头尾结点方法*/
    int listLengh(){
   return size;}
    Node* headNode(){
   return pHead;}
    Node* tailNode(){
   return pTail;}
private:
    size_t size;
    Node* pHead;//头结点指针
    Node* pTail;//尾节指针

};
#endif

list.cpp

#include "list.h"

typedef int ElementType;//数据类型

List::List(){
   
    size = 0;
    pHead = new Node();
    pTail = pHead;
}

List::~List(){
   
    while(size > 0){
   
        deleteNode(pHead);
    }
    delete pHead;
    pHead = NULL;
}

/*链表相关操作*/
void List::insertHead(ElementType data){
   
    Node* node = new Node();
    node->data = data;
    if(size == 0)
        pTail = node;
    node->next = pHead->next;
    pHead->next = node;
    size++;

}
void List::insertTail(ElementType data){
   
    Node* node = new Node();
    node->data = data;
    node->next = pTail->next;///
    pTail->next = node;
    pTail = pTail->next;
    size++;

}
bool List::insertNext(Node* node,ElementType data){
   //把数据插入到结点node的后面
    if(node == NULL)
        return false;
    Node* p = new Node();
    p->data = data;
    p->next = node->next;
    node->next = p;

    if(node == pTail)//插入的结点为尾部时,移动尾部指针
        pTail = p;
    size++;
    return true;
}

bool List::deleteNode(Node* node){
   //删除结点node后面的结点
    if(NULL == node || NULL == node->next)
        return false;
    Node *p = node->next;
    node->next = node->next->next;
    delete p;
    size--;
    return true;
}

void List::displayList(){
   //从头打印链表元素
    Node* p = pHead->next;
    while(p != NULL){
   
        cout << p->data << " " ;
        p = p->next;
    }
    cout << endl;

}
void List::reverse(){
   //反转链表
    if(size < 2)
        return;
    //pre是p的前序结点,post是p的后序结点
    Node* pre = pHead->next;
    Node* p = pre->next;
    Node* post = 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链表是一种常用的数据结构,用于存储一系列元素。C语言中,链表是通过指针来实现的,每个节点包含数据和指向下一个节点的指针。 以下是链表的基础知识总结: 1. 链表的定义: ```c struct Node { int data; struct Node* next; }; ``` 其中,data 表示节点存储的数据,next 表示指向下一个节点的指针。 2. 链表操作: - 创建节点: ```c struct Node* createNode(int data) { struct Node* node = (struct Node*) malloc(sizeof(struct Node)); node->data = data; node->next = NULL; return node; } ``` - 插入节点: ```c void insertNode(struct Node* head, int data) { struct Node* node = createNode(data); node->next = head->next; head->next = node; } ``` 其中,head 表示链表头节点。 - 删除节点: ```c void deleteNode(struct Node* head, int data) { struct Node* p = head->next; struct Node* q = head; while (p != NULL) { if (p->data == data) { q->next = p->next; free(p); break; } q = p; p = p->next; } } ``` - 遍历链表: ```c void traverseList(struct Node* head) { struct Node* p = head->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } ``` - 销毁链表: ```c void destroyList(struct Node* head) { struct Node* p = head->next; while (p != NULL) { struct Node* q = p; p = p->next; free(q); } head->next = NULL; } ``` 3. 链表的优缺点: 链表的优点是插入和删除操作的时间复杂度为 O(1),而数组的时间复杂度为 O(n)。但是,链表的缺点是无法随机访问元素,需要遍历整个链表才能找到要查找的元素。此外,链表需要额外的空间来存储指向下一个节点的指针。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值