单链表删除节点的方法 - 极悦
首页 课程 师资 教程 报名

单链表删除节点的方法

  • 2022-09-01 10:26:32
  • 937次 极悦

从链表中删除给定节点。

例子

链表:102030无效的

输入

20

输出

1030无效的

输入

30

输出

1020无效的

算法

1.如果头节点有给定的key,

使头节点指向第二个节点并释放其内存。

2. 否则,

从当前节点,检查下一个节点是否有给定的key

如果是,则使 current->next = current->next->next 并释放内存。

否则,将当前节点更新为下一个节点并执行上述过程(从步骤 2 开始)直到最后一个节点。

头节点具有给定的密钥

void  deleteNode ( struct node ** head, int key)
{
      //temp用于释放内存
      struct node * temp;     
      //在头节点上找到的键。
      //移动到头节点到下一个并释放头。
      if ( * head -> data == key)
      {
          温度=  *头;    //备份head以释放内存
          * head = ( * head) -> next;
          免费(临时);
      }    
}

视觉表现

让我们删除数据 10(头节点)。

对于其他节点(Non-Head)

void  deleteNode ( struct node ** head, int key)
{
      //temp用于释放内存
      struct node * temp;
      //在头节点上找到的键。
      //移动到头节点到下一个并释放头。
      如果((*头)->数据==键)
      {
          温度=  *头;    //备份释放内存
          * head = ( * head) -> next;
          免费(临时);
      }      
      别的
      {
          结构节点*当前  =  *头;
          而(当前->下一个!=  NULL)
          {
              //如果是,我们需要删除当前->下一个节点
              if (current -> next -> data == key)
              {
                  临时=当前->下一个;
                  //节点将与链表断开连接。
                  当前->下一个=当前->下一个->下一个;
                  免费(临时);
                  休息;
              }
              //否则,移动当前节点并继续
              else 
                  current = current -> next;
          }
      }    
}

视觉表现

让我们删除数据 20

删除链表中节点的实现

例子

#include<stdio.h> 
#include<stdlib.h>
结构节点
{
    整数数据;
    结构节点*下一个;
};
void  addLast ( struct node ** head, int val)
{
    //创建一个新节点
    struct node * newNode = malloc( sizeof ( struct node));
    新节点->数据= val;
    新节点->下一个     =  NULL ;
    //如果head为NULL,它是一个空列表
    if ( * head ==  NULL )
          * head = newNode;
    //否则,找到最后一个节点,添加newNode 
    else
    {
        结构节点* lastNode =  *头;
        //最后一个节点的下一个地址将为NULL。
        while (lastNode -> next !=  NULL )
        {
            最后一个节点=最后一个节点->下一个;
        }
        //在链表末尾添加newNode 
        lastNode -> next = newNode;
    }
}
void  deleteNode ( struct node ** head, int key)
{
      //temp用于释放内存
      struct node * temp;
      //在头节点上找到的键。
      //移动到头节点到下一个并释放头。
      如果((*头)->数据==键)
      {
          温度=  *头;    //备份释放内存
          * head = ( * head) -> next;
          免费(临时);
      }
      别的
      {
          结构节点*当前  =  *头;
          而(当前->下一个!=  NULL)
          {
              //如果是,我们需要删除当前->下一个节点
              if (current -> next -> data == key)
              {
                  临时=当前->下一个;
                  //节点将与链表断开连接。
                  当前->下一个=当前->下一个->下一个;
                  免费(临时);
                  休息;
              }
              //否则,移动当前节点并继续
              else 
                  current = current -> next;
          }
      }
}
无效 打印列表(结构节点*头)
{
    结构节点*温度=头;
    //迭代整个链表并打印数据
    while (temp !=  NULL )
    {
         printf( "%d ->" , temp -> data);
         温度=温度->下一个;
    }
    printf( "NULL \n " );
}
主函数 ()
{
     结构节点*头=  NULL ;
     addLast( &头, 10 );
     addLast( &头, 20 );
     addLast( &头, 30 );
     printf( "链表元素:\n " );
     打印列表(头);
     //删除第一个节点
     deleteNode( & head, 10 );
     printf( "删除10.新链表:\n " );
     打印列表(头);
     //删除最后一个节点
     deleteNode( & head, 30 );
     printf( "删除 30. 新链表:\n " );
     打印列表(头);
     //删除 20 
     deleteNode( & head, 20 );
     printf( "已删除 20. 新链表:\n " );
     打印列表(头);
     返回 0 ;
}

 

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交