编程导航算法通关村第1关 | 青铜:单链表的增删改查

1. 构造链表

链表中的每一个节点包含数据域和指针域 (构造在一个 struct 中),数据变量存储数据,指针变量存储下一个节点的地址。

链表的一个节点只能有一个后继

特点:

链表节点在内存中的位置可以不连续。

思路:
struct 包装节点 :成员包括数据和地址
class 包装链表 :成员有 head(一个指针变量)

struct node {
    // pointor
    node * next;
    // data
    int data;
    node(){next = NULL;data = 0;}
};
class list {
public:
    node * head;
    node * checker; // 跟踪节点
public:
    list();
    ~list();
    void appendNode(int val); //尾部插入
    void appendNode(const int &pos,const int &val); //随机插入
    void print() const;
    void removeNode(int val);
};

2.完整代码

#include <iostream>

using namespace std;

struct node {
    // pointor
    node * next;
    // data
    int data;
    node(){next = NULL;data = 0;}

};

class list {
public:
    node * head;
    node * checker; // 跟踪节点
    int count;
public:
    list();
    ~list();
    void appendNode(int val); //尾部插入
    void appendNode(const int &pos,const int &val); //随机插入
    void print() const;
    void removeNode(int val);
    int size(){return count;}

};

int main()
{
    list list1;
    int count;
    cout << "create list 0~9" << endl;
    list1.appendNode(0);
    list1.appendNode(1);
    list1.appendNode(2);
    list1.appendNode(3);
    list1.appendNode(4);
    list1.appendNode(5);
    list1.appendNode(6);
    list1.appendNode(7);
    list1.appendNode(8);
    list1.appendNode(9);
    list1.print();
    cout << "--------" << endl;
    cout << "delete 0" << endl;
    list1.removeNode(0);
    list1.print();
    cout << "--------" << endl;
    cout << "delete 5" << endl;
    list1.removeNode(5);
    list1.print();
    cout << "--------" << endl;
    cout << "delete 9" << endl;
    list1.removeNode(9);
    list1.print();
    count = list1.size();
    cout << "the number of elements are : " <<count << endl;
    return 0;
}

list::list() {
    head = NULL;
    checker = NULL;
    count = 0;
}

list::~list()
{
    node * temp = NULL;
    while(head != NULL) {
        temp = head;
        head = head->next;
        delete temp;
    }
}


void list::appendNode(int val)
{
    node * temp = new node;
    temp->data = val;
    temp->next = NULL;
    if(head == NULL) {
        head = temp;
        count++;
    }
    else {
        checker = head;
        while(checker->next != NULL) {
            checker = checker->next;
        } //寻找尾部节点
            checker->next = temp;
            count++;
    }
}

void list::appendNode(const int &pos, const int &val)
{
    node * previous = nullptr;
    node * current = head;
    node * temp = new node;
    temp->data = val;
    temp->next = NULL;

    if (pos == 0 || pos == 1) {
        temp->next = head;
        head = temp;
        count++;
        return;
    }
    int i;
    for(i = 0; i < pos - 1; i++) {
        previous = current;
        current = current->next; //current 一开始在头节点位置
    }
    previous->next = temp;
    temp->next = current;
    count++;
}

void list::print() const
{
    node * worker = head;
    while(worker != NULL) {
        cout << worker->data << " ";
        worker = worker->next;
    }
    cout << endl;
}

void list::removeNode(int val)
{

    if(head == NULL) {
        cout << "error, list does not exist" << endl;
        return;
    }
    //寻找尾部节点
    node * tail = head;
    node * previous = NULL;
    node * temp = NULL;
    node * current = head;
    //用双指针找到了尾部节点
    while(tail->next != NULL) {
        previous = tail;
        tail = tail->next;
    }
    //删除头部节点
    if(head->data == val) {
        temp = head;
        head = head->next;
        delete temp;
        count--;
    }
    //删除尾部节点
    else if(tail->data == val) {
        //fixme:
        previous->next = NULL;
        delete tail;
        count--;
    }
    // 删除中间节点
    else {
        previous = NULL;
        while (current != NULL) {
            if(current->data == val) {
                break;
            }
            else {
                previous = current;
                current = current->next;
            }
        }
        if(current != NULL) {
            temp = current;
            previous->next = current->next;
            delete temp;
        }
        else {
            cout << val << " is not exist in the list." << endl;
        }
        count--;
    }
}


3. 测试结果

在这里插入图片描述

4. 总结问题

完成一个单链表的设计需要解决的问题如下:

  1. head 怎么创建?
  2. list 类中的成员变量和方法都有哪些?
  3. 双指针怎么设计?
  4. 用C语言写的时候最后如何释放空间?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值