卡码网语言基础课 | 15. 链表的基础操作Ⅲ

目录

一、 插入链表的过程

二、 删除链表的过程

三、 打印链表

3.1 判断节点是否处于链尾

3.2 打印链表

3.3 循环体结束,遍历打印


题目:

请编写一个程序,实现以下链表操作:构建一个单向链表,链表中包含一组整数数据。 

1. 实现在链表的第 n 个位置插入一个元素,输出整个链表的所有元素。
2. 实现删除链表的第 m 个位置的元素,输出整个链表的所有元素。 

要求: 

1. 使用自定义的链表数据结构。
2. 提供一个 linkedList 类来管理链表,包含构建链表、插入元素、删除元素和输出链表元素的方法。
3. 在 main 函数中,创建一个包含一组整数数据的链表,然后根据输入的 n 和 m,调用链表的方法插入和删除元素,并输出整个链表的所有元素。

一、 插入链表的过程

在链表中,具体插入的过程如下:

  • 找到要插入的位置的前一个节点,将之命名为cur, 要插入的位置的下一个节点,将之命名为tmp, 它们之间的关系是cur -> next = tmp
  • 创建一个新的链表newNode, 将curnext指针指向newNode, 即cur -> next = nowNode
  • newNodenext指针指向tmp, 即newNode -> next = tmp

 其相应的代码表示如下:

//创建新的ListNode结构的节点,值为X,并将其地址赋给指针newNode
ListNode *newNode = new ListNode(x);

//创建名为tmp的指针,临时存储当前节点cur的下一个节点地址
ListNode *tmp = cur -> next;

//将当前节点cur的指针更新指向新节点newNode,并将新节点插入到当前节点后面
cur -> next = newNode;

//将新节点newNode的指针设置为指向临时指向节点tmp
newNode -> next = tmp;

二、 删除链表的过程

删除链表则相对简单,只需要找到删除元素的前一个节点cur,并将其指针指向更新为删除元素的下一个节点即可,实现删除操作。具体代码实现如下所示:

//cur表示删除元素的前一个节点名
//cur -> next 表示指针指向当前删除元素
//cur -> next -> next 表示指针指向删除元素的后一个节点

cur -> next = cur -> next -> next;

三、 打印链表

3.1 判断节点是否处于链尾

当前节点cur的下一节点 cur -> next,如果为NULL,则为链尾。

//判断是否迭代至链尾

while(cur -> next != NULL){

}

3.2 打印链表

在循环体内,打印当前节点(cur)的下一节点(cur -> next)的值(val)。并更新当前节点指向下一个节点。

while(cur -> next != NULL){
    cout << cur -> next -> val << " ";
    cur = cur -> next;
}

3.3 循环体结束,遍历打印

void printLinklist(ListNode* head) {
    ListNode* cur = head;
    while (cur->next != NULL) {
        cout << cur -> next -> val << " ";
        cur = cur -> next;
    }
    cout << endl;
}

解答:

#include <iostream>
using namespace std;

struct ListNode{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(nullptr){}
};

//打印链表
void printLinklist(ListNode* dummyHead){
    ListNode* cur = dummyHead;
    while(cur ->next != NULL){
        cout << cur -> next -> val << " ";
        cur = cur -> next;
    }
    cout << endl;
}

int main(){
    int k, val;
    
    //创建虚拟头结点
    ListNode* dummyHead = new ListNode(0);

    cin >> k;
    
    int listLen = k; //定义链表长度

    //定义当前节点cur,并将初始指针指向虚头结点
    ListNode* cur = dummyHead;

    for(int i = 0; i < k; i++){
        cin >> val;
        ListNode *newNode = new ListNode(val); //构造一个新的节点
        cur -> next = newNode; //将新的节点接入链表
        cur = cur -> next; //cur指向下一个节点
    }
    
    //增加节点
     int s, n, x;
     cin >> s;
     while(s--){
         cin >> n >> x; //输入n和x
         if(n <= 0 || n > listLen){
             cout << "Insertion position is invalid." << endl; //输出错误提示
             continue;
         }
   
   
   //指针重新指向虚拟头结点,并准备用cur遍历链表
   cur = dummyHead;
   
   //寻找添加节点的位置,i从1开始
   for(int i = 1; i < n; i++){
       cur = cur -> next;
   }
   
   //插入节点
   ListNode* newNode = new ListNode(x);
   ListNode* tmp = cur -> next;
   cur -> next = newNode;
   newNode -> next = tmp;
   
   //链表长度+i从1
   listLen++;
   
   //打印链表
   printLinklist(dummyHead);
   
   }
   
   //删除节点
    int l, m;  //注意这里为L的小写,不是数字1
    cin >> l;    
   while(l--){
       cin >> m;
       if(m <= 0 || m > listLen){//PS:遗漏<0
           cout << "Deletion position is invalid." << endl;
           continue;
       }
       
       //指针重新指向虚拟头结点
       cur = dummyHead;
       
       //开始寻找删除节点位置,i从1开始,因节点计数从1开始
       for(int i = 1; i < m; i++) cur = cur -> next;
       
       //删除节点 
       cur -> next = cur -> next -> next;
       
       listLen--; //链表长度-1
       
       //如果删除节点后链表为空则不打印
       if(listLen != 0) printLinklist(dummyHead);
   }
   
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值