数据结构-单链表的操作

单链表的操作

数据结构学习中关于链表的基本操作的笔记文档

1.定义单链表

/*创建链表:以整型链表为例*/
struct Node{
    int data;
    struct Node *next;
};
typedef struct Node LinkListNode;//定义变量名称

2.单链表的基本操作

  1. 初始化链表
LinkListNode* InitLinkList(){
    /*初始化链表*/
    LinkListNode* head = new LinkListNode;
    head -> next = NULL;
    return head;
}

初始化链表其实就是创建了一个头结点,并令其指向NULL。

注意:在链表中,一般情况下,头结点是不储存数据的

  1. 获得链表第index个数据的值
LinkListNode* GetElement(LinkListNode* head, int index, int &result){
    /*获得链表第index个数据:以整型链表为例*/
    /*用到了c++的引用代替指针返回result结果*/
    int i = 1;
    LinkListNode* p = head->next;
    while(p){
        if(i == index){
            break;
        }
        i++;
        p = p->next;
    }
    result = p->data;
    return head;
}
  1. 单链表的整表删除
LinkListNode* ClearLinkList(LinkListNode* head){
    /*单链表的整表删除*/
    LinkListNode* p, *q;
    p = head->next;
    while(p){
        /*不能忽略q,q保证1链表在free了每一个节点后,还能找到下一个*/
        q = p->next;
        delete p;//c++中的释放内存方法
        p = q;
    }
    head->next = NULL;
    return head;
}

3.头插法与尾插法

  • 头插法
LinkListNode* InverAppendLinkList(LinkListNode* head){
    /*链表头插法: 输入一串数字,以-1为结尾,倒序插入链表*/
    LinkListNode* newNode;
    int i = 1,j = 0;
    while(i){
        scanf("%d", &j);
        if (j != -1){
            newNode = new LinkListNode;
            newNode->data = j;
            newNode->next = head->next;
            head->next = newNode;
        }
        else{
            i = 0;
        }
    }
    return head;
}

核心代码:

 newNode->next = head -> next;
 head->next = newNode;

将新申请的待插入结点指向头指针,再令头指针为该新申请的结点

  • 尾插法
LinkListNode* AppendLinkList(LinkListNode* head){
    /*链表尾插法:输入一串数字,以-1为结尾,插入链表*/
    LinkListNode *newNode, *last;
    last = head;
    int i = 1,j = 0;
    while(i){
        scanf("%d", &j);
        if(j != -1){
            newNode = new LinkListNode;
            newNode->data = j;
            last->next = newNode;//在尾部加入新节点
            last = newNode;//以新节点为新的尾部节点
        }
        else{
            i = 0;
            last->next = NULL;
        }
    }
    return head;

}

核心代码:

last->next = newNode;
last = newNode;

将新申请的结点放入链表末尾(让原先的末尾指向它),再令新申请的结点为新的末尾

有时候,以-1为结尾的一串数字放入链表这一操作并不适用,假如我们提前知道待插入数字的长度,可以使用如下方法

LinkListNode* AppendLinkListByList(LinkListNode* head, int length){
    /*不通过-1为结尾,尾插法给链表传入数据(确定数据数量)*/
    LinkListNode* last, *newNode;
    last = head;
    int i = 0, j = 0, number = 0;
    for(i = 0;i < length; i++){
        scanf("%d",&number);
        newNode = new LinkListNode;
        newNode->data = number;
        last->next = newNode;
        last = newNode;
    }
    if(i == length - 1){
        last->next = NULL;
    }
    return head;
}

4.链表的增删操作

  • 插入元素

已知待插入位置的前一结点的指针:

LinkListNode* InsertLinkList(LinkListNode* head, LinkListNode* previous, int element){
    /*链表插入元素*/
    LinkListNode* newNode = new LinkListNode;
    newNode->data = element;
    newNode->next = previous->next;
    previous->next = newNode;
    return head;
}
  • 删除元素

根据前一结点位置删除:

LinkListNode* DeleteLinkList(LinkListNode* head, LinkListNode* previous){
    /*链表删除元素*/
    LinkListNode* tail = previous->next;
    previous->next = previous->next->next;
    free(tail);
    return head;
}

根据元素值删除:

LinkListNode* PopLinkList(LinkListNode* head, int index){
    /*删除指定位置的元素*/
    int i = 1;
    LinkListNode* p = head->next;
    while(p){
        if(i == index-1){
            break;
        }
        i++;
        p = p->next;
    }//此时p为待删除的节点的前节点
    LinkListNode* temp = p->next;
    p->next = p->next->next;
    free(temp);
    return head;
}
  • Append操作

在链表末尾加入一个元素:

LinkListNode* Append(LinkListNode* head, int element){
    /*在链表尾部插入一个元素*/
    LinkListNode* newNode = new LinkListNode;
    newNode->data = element;
    LinkListNode* tail = head->next;
    while(tail){
        tail = tail->next;
    }
    tail->next = newNode;
    tail = newNode;
    return head;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值