精华内容
下载资源
问答
  • 删除单链表最后一个节点

    千次阅读 2021-03-07 01:26:22
    链表中有多个节点,链表的最后一个节点将被删除。1. 链表中只有一个节点条件head → next = NULL将继续存在,因此,链表的唯一节点head将被指定为null。 这将通过使用以下语句来完成。ptr = head;head = NULL;free...

    从链表的末尾删除节点,有两种情况。

    链表中只有一个节点,需要删除。

    链表中有多个节点,链表的最后一个节点将被删除。

    1. 链表中只有一个节点

    条件head → next = NULL将继续存在,因此,链表的唯一节点head将被指定为null。 这将通过使用以下语句来完成。

    ptr = head;

    head = NULL;

    free(ptr);

    2. 链表中有多个节点

    条件head→next = NULL将失败,因此,必须遍历节点才能到达链表的最后一个节点。

    为此,只需声明一个临时指针temp并将其指定给链表的头部。还需要跟踪链表的倒数第二个节点。所以使用两个指针ptr和ptr1,其中ptr将指向最后一个节点,ptr1将指向链表的倒数第二个节点。通过使用以下语句来完成。

    ptr = head;

    while(ptr->next != NULL)

    {

    ptr1 = ptr;

    ptr = ptr ->next;

    }

    现在,只需要使指针ptr1指向下一个节点为NULL,并且ptr将变释放。它将通过使用以下语句来完成。

    ptr1->next = NULL;

    free(ptr);

    算法

    第1步:IF HEAD = NULL

    打印内存溢出。

    转到第8步

    [结束]

    第2步:设置PTR = HEAD

    第3步:重复第4步和第5步,同时PTR - > NEXT!= NULL

    第4步:SET PREPTR = PTR

    第5步:SET PTR = PTR - > NEXT

    [循环结束]

    第6步:SET PREPTR - > NEXT = NULL

    第7步:释放PTR

    第8步:退出

    示意图 -

    03c9f4d169360c87a9e47b33676f5b7d.png

    C语言示例代码 -

    #include

    #include

    void create(int);

    void end_delete();

    struct node

    {

    int data;

    struct node *next;

    };

    struct node *head;

    void main()

    {

    int choice, item;

    do

    {

    printf("1.Append List\n");

    printf("2.Delete node\n");

    printf("3.Exit\n");

    printf("4.Enter your choice ? ");

    scanf("%d", &choice);

    switch (choice)

    {

    case 1:

    printf("\nEnter the item\n");

    scanf("%d", &item);

    create(item);

    break;

    case 2:

    end_delete();

    break;

    case 3:

    exit(0);

    break;

    default:

    printf("\nPlease enter valid choice\n");

    }

    } while (choice != 3);

    }

    void create(int item)

    {

    struct node *ptr = (struct node *)malloc(sizeof(struct node *));

    if (ptr == NULL)

    {

    printf("\nOVERFLOW\n");

    }

    else

    {

    ptr->data = item;

    ptr->next = head;

    head = ptr;

    printf("\nNode inserted\n");

    }

    }

    void end_delete()

    {

    struct node *ptr, *ptr1;

    if (head == NULL)

    {

    printf("\nlist is empty");

    }

    else if (head->next == NULL)

    {

    head = NULL;

    free(head);

    printf("\nOnly node of the list deleted ...");

    }

    else

    {

    ptr = head;

    while (ptr->next != NULL)

    {

    ptr1 = ptr;

    ptr = ptr->next;

    }

    ptr1->next = NULL;

    free(ptr);

    printf("\n Deleted Node from the last ...");

    }

    }

    执行上面示例代码,得到以下结果 -

    1.Append List

    2.Delete node

    3.Exit

    4.Enter your choice?1

    Enter the item

    12

    Node inserted

    1.Append List

    2.Delete node

    3.Exit

    4.Enter your choice?2

    Only node of the list deleted ...

    ¥ 我要打赏

    纠错/补充

    收藏

    上一篇:链表

    下一篇:双链表

    加QQ群啦,易百教程官方技术学习群

    注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

    展开全文
  • 单链表--删除节点

    2021-08-02 15:31:22
    目的:删除一个链表中的末尾节点。 实现思路:新建一个指向头节点节点。遍历循环链表,直到找到链表尾节点,让新建的节点的next为空,尾节点的value为null,再把新建的节点更新至尾节点的位置。 public void ...

    目的:删除一个链表中的末尾节点。

    实现思路:新建一个指向头节点的节点。遍历循环链表,直到找到链表尾节点,让新建的节点的next为空,尾节点的value为null,再把新建的节点更新至尾节点的位置。

    public void removeTail() {
        if(head==null){//链表为空
            return;
            }
        else if(size==1){//只有一个节点
            head.value=null;
            head=null;
            tail=null;
            }else {//一般情况
            Node<T> p=head;
            for(;p.next!=tail;p=p.next){
            }
            p.next=null;
            tail.value=null;
            tail=p;
            }
        }

    时间复杂度为O(n):遍历链表去寻找尾节点

    展开全文
  • L是一个带头结点的单链表,函数ListLocateAndDel_L(LinkList L, ElemType x)要求在链表中查找最后一个数据域取值为x的节点并将其删除。例如,原单链表各个节点的数据域依次为1 3 1 4 3 5,则ListLocateAndDel_L(L,3)...

    本题要求在链表中删除最后一个数据域取值为x的节点。L是一个带头结点的单链表,函数ListLocateAndDel_L(LinkList L, ElemType x)要求在链表中查找最后一个数据域取值为x的节点并将其删除。例如,原单链表各个节点的数据域依次为1 3 1 4 3 5,则ListLocateAndDel_L(L,3)执行后,链表中剩余各个节点的数据域取值依次为1 3 1 4 5。
    函数接口定义:

    void ListLocateAndDel_L(LinkList L, ElemType x);

    其中 L 是一个带头节点的单链表。 x 是一个给定的值。函数须在链表中定位最后一个数据域取值为x的节点并删除之。
    裁判测试程序样例:

    //库函数头文件包含
    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>

    //函数状态码定义
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1
    #define OVERFLOW -2
    #define NULL 0

    typedef int Status; typedef int ElemType; //假设线性表中的元素均为整型

    typedef struct LNode {
    ElemType data;
    struct LNode *next; }LNode,*LinkList;

    //链表创建函数 Status ListCreate_L(LinkList &L,int n) {
    LNode rearPtr,curPtr;
    L=(LNode
    )malloc(sizeof (LNode));
    if(!L)exit(OVERFLOW);
    L->next=NULL;
    rearPtr=L;
    for (int i=1;i<=n;i++){
    curPtr=(LNode
    )malloc(sizeof(LNode));
    if(!curPtr)exit(OVERFLOW);
    scanf("%d",&curPtr->data);
    curPtr->next=NULL;
    rearPtr->next=curPtr;
    rearPtr=curPtr;
    }
    return OK; } //链表输出函数 void ListPrint_L(LinkList L) {
    LNode *p=L->next;
    if(!p){
    printf(“空表”);
    return;
    }
    while(p!=NULL)
    {
    if(p->next!=NULL)
    printf("%d “,p->data);
    else
    printf(”%d",p->data);
    p=p->next;
    } } //下面是需要实现的函数的声明 void ListLocateAndDel_L(LinkList L, ElemType x);

    int main() {
    LinkList L;
    int n;
    int x;
    scanf("%d",&n); //输入链表中元素个数
    if(ListCreate_L(L,n)!= OK) {
    printf(“表创建失败!!!\n”);
    return -1;
    } scanf("%d",&x); //输入待查找元素 ListLocateAndDel_L(L,x); ListPrint_L(L); return 0; }

    /* 请在这里填写答案 */

    输入样例:

    6 1 3 1 4 3 5 3

    输出样例:

    1 3 1 4 5

    思路
    题目要求是在链表中删除最后一个数据域取值为x的节点,所以先要对链表进行一次全部的遍历,找到节点位置,而不是中途break; 然后再进行一次遍历,如果等于,break。
    代码展示

    void ListLocateAndDel_L(LinkList L, ElemType x){
        LinkList p1 = L, p2 = L->next, q = NULL;
        while (p2){					//第一次遍历
            if(p2->data == x) q = p2; //定位
            p2 = p2->next;
        }
        p2 = L->next;
        while(p2){				//第二次遍历
            if(p2 == q){
                p1->next = p2->next;
                free(q);
                break;
            }
            p1 = p1->next;
            p2 = p2->next;
        }
    }
    
    展开全文
  • L是一个带头结点的单链表,函数ListLocateAndDel_L(LinkList L, ElemType x)要求在链表中查找最后一个数据域取值为x的节点并将其删除。例如,原单链表各个节点的数据域依次为1 3 1 4 3 5,则ListLocateAndDel_L(L,3)...

    本题要求在链表中删除最后一个数据域取值为x的节点。L是一个带头结点的单链表,函数ListLocateAndDel_L(LinkList L, ElemType x)要求在链表中查找最后一个数据域取值为x的节点并将其删除。例如,原单链表各个节点的数据域依次为1 3 1 4 3 5,则ListLocateAndDel_L(L,3)执行后,链表中剩余各个节点的数据域取值依次为1 3 1 4 5。

    函数接口定义:

    void ListLocateAndDel_L(LinkList L, ElemType x);

    其中 L 是一个带头节点的单链表。 x 是一个给定的值。函数须在链表中定位最后一个数据域取值为x的节点并删除之。

    裁判测试程序样例:

    
    //库函数头文件包含
    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    
    //函数状态码定义
    #define TRUE        1
    #define FALSE       0
    #define OK          1
    #define ERROR       0
    #define INFEASIBLE -1
    #define OVERFLOW   -2
    #define NULL        0
    
    typedef int  Status;
    typedef int  ElemType; //假设线性表中的元素均为整型
    
    typedef struct LNode
    {
        ElemType data;
        struct LNode *next;
    }LNode,*LinkList;
    
    //链表创建函数
    Status ListCreate_L(LinkList &L,int n)
    {
        LNode *rearPtr,*curPtr;
        L=(LNode*)malloc(sizeof (LNode));
        if(!L)exit(OVERFLOW);
        L->next=NULL;
        rearPtr=L;
        for (int i=1;i<=n;i++){
            curPtr=(LNode*)malloc(sizeof(LNode));
            if(!curPtr)exit(OVERFLOW);
            scanf("%d",&curPtr->data);
            curPtr->next=NULL;
            rearPtr->next=curPtr;
            rearPtr=curPtr;
        }
        return OK;
    }
    //链表输出函数
    void ListPrint_L(LinkList L)
    {
        LNode *p=L->next;
        if(!p){
            printf("空表");
            return;
        }
        while(p!=NULL)
        {
           if(p->next!=NULL)
               printf("%d ",p->data);
           else
               printf("%d",p->data);
              p=p->next;
        }
    }
    //下面是需要实现的函数的声明
    void ListLocateAndDel_L(LinkList L, ElemType x);
    
    int main()
    {
        LinkList L;
        int n;
        int x;
        scanf("%d",&n);  //输入链表中元素个数
        if(ListCreate_L(L,n)!= OK) {
              printf("表创建失败!!!\n");
              return -1;
        }
       scanf("%d",&x); //输入待查找元素
       ListLocateAndDel_L(L,x);
       ListPrint_L(L);
       return 0;
    }
    
    /* 请在这里填写答案 */

    输入样例:

    6
    1 3 1 4 3 5
    3

    结尾无空行

    输出样例:

    1 3 1 4 5

    题目思路:先定义两个结构体指针备用,在定义一个计数器,遍历链表,找出共有几个符合条件的值,再删除左后一个符合条件的值。而在删除时,因为用了while(p->next != NULL),所以如果最后一个数使符合条件的 那么常规删不掉,只能作为特殊情况处理。

    答案如下:(好好学习奥,仅供参考哈)

    //思路:从头节点开始用指针遍历链表,找出共有几个x,记录个数,再从头开始遍历
    //找到最后一个x的时候记录他的前一个节点的位置,将前一个节点的next指向后一个节点。
    //注意;链表为空退出,删除最后一个节点时可以吗?
    void ListLocateAndDel_L(LinkList L, ElemType x){
    int count = 0;
    LNode *p,*prep,*postp;
    p = L;
    while(p->next != NULL){
        if(p->next->data == x&&p->next == NULL){
            p->next = NULL;
            break;
        }
        else if(p->next->data == x){
            count++;
        }
        p = p->next;
    }
    p = L;
    int flag = 0;
    while(p->next != NULL){
        if(p->next->data == x){
            flag++;
            if(flag == count){
                prep = p;
                p = p->next;
                prep->next = p->next;
            }
        }
        p = p->next;
        }
    }

    展开全文
  • 单链表移除节点

    2021-02-22 14:22:25
    【12.8-5】编写一个程序,从一个单链表中移除一个节点,函数的原型如下: int sll_remove(struct NODE **rootp, struct NODE *node); 你可以假设节点数据结构在头文件singly_linked_list_node.h中定义,函数的第...
  • #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; //数据域 struct Node * pNext;... //创建不带头结点的单链表 ... //删除从指定位置开始的连续多个节点 int length_linklist.
  • 目的:在给定一个链表,删除指定的节点,让其时间复杂度为O(1) ...删除最后一个节点的时间复杂度为O(n),但是前面n-1和节点删除的时间复杂度为O(1),总体来看,这种方法满足条件,使时间复杂度为O(1)。 ...
  • 单链表_节点定义&单链表基本操作

    千次阅读 2021-02-17 11:36:08
    链表的引入 链表     顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的...   单向链表也叫做单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素
  • (1)删除某个位置pos的节点;(2)判断x值是否在链表中,若存在则删除节点;核心代码如下://删除某个位置pos的节点Node *DeletePosNode(Node *pNode,int pos){int i = 1;Node *pMove;Node *pMovePre;pMovePre = ...
  • 问题描述:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.解题思路:采用...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼我想了一个小时也看不出来 ,求大神帮忙 ,指点 。必粉!!!#include#include#define LEN sizeof(struct node)struct node{int no;struct node *next;};struct node *...
  • 单从2节点开始没法删除(因为只能取到下一个节点) 这时候要先从1节点,连续取后两个节点,然后用3节点指向第一个节点。 代码: 在上一节的Node类中,新写一个方法 //删除一个节点 public void removeNext(){ ...
  • L是一个带头结点的单链表,函数ListLocateAndDel_L(LinkList L, ElemType x)要求在链表中查找最后一个数据域取值为x的节点并将其删除。例如,原单链表各个节点的数据域依次为1 3 1 4 3 5,则ListLocateAndDel_L(L,3)...
  • 代码 package com.atguigu.linkedlist; /** * @className: SingleLinkedListDemo * @description: 单链表测试 * @date: 2021/2/28 * @author: cakin */ public class SingleLinkedListDemo { /** * 功能...
  • 在循环单链表删除末尾节点有三种情况。情况1(链表为空)如果链表为空,则条件head == NULL将变为true,在这种情况下,只需要在屏幕上打印下溢并退出。if(head == NULL) { printf("UNDERFLOWn"); return; }情况2...
  • 一个指针指向此单链表中间的一个节点(非第一个节点, 也非最后一个节点)。请将该节点单链表删除。解答:典型的“狸猫换太子”, 若要删除节点,正常情况下,应该要知道该节点的前面节点的指针,但是由于单链表...
  • 头插法:在head结点之后新增(插入)一个结点; 尾插法:在尾结点之前新增(插入)一个结点; 中间插入:在指定位置之后新增(插入)一个结点; 我这次写的为中间插入的操作,如下: 在第几个结点之前添加一个结点,...
  • 链表删除一个节点时间复杂度分析

    千次阅读 2021-04-08 08:40:32
    时间复杂度:O(N),因为最好的情况是头指针就是...链表删除一个节点的案例分析,直接看有没有for循环,最好情况就是执行一次解决,最快情况就是最后一个节点才是你要删除节点,此时循环n次。时间复杂度为O(n) ...
  • 1. 已知单链表A,编写一个算法,删除单链表中第一个最大元素。 2. 已知单链表L, 编写一个算法,删除其重复的结点(只保留一个)。
  • 前面我们学到线性表的顺序存储结构(顺序表),发现它有着明显的缺点:...链表中的数据是以结点来表示的,每个结点的构成:元素(存放的数据元素)+指针(指示下一个元素存储位置,单、双链表的最后一个节点除外,它们.
  • 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点。 public static Node removeLastKthNode(Node head, int lastKth){ if (head == null || lastKth < 1){ return...
  • if (head->next != NULL) { Node* q = head->next; Node* p = head;//设置一个跟随节点 while (q->next !...//找到最后一个节点 ...//找一个节点记录最后一个节点数据 p->..
  • 题目链接难度:简单 类型: 链表请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除节点。示例1输入: head = [4,5,1,9], node = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二...
  • python单链表中如何插入和输出节点?下面本篇文章就来带大家了解一下单链表是什么,如何对单链表执行的一些非常基本的操作,例如:插入...在单链表中,每个节点的地址部分包含有关下一个节点位置的信息;这形成一系...
  • // 指向的下一个节点 ListNode next; // 有参构造函数,初始化就直接给val赋值 ListNode(int x) { val = x; } public static void main(String[] args) { // 定义五个节点 ListNode a = new ListNode(1)...
  • 1.遍历单链表 // 遍历单链表,pH为指向单链表的头指针,遍历的节点数据打印出来 void bianli(struct node*pH) ... // p直接走到第一个节点 printf("-----------开始遍历-----------\n"); while
  • ): Node { var currentNode: Node = this // 寻找最后一个节点,在最后一个节点追加新的节点 while (currentNode.next != null) { currentNode = currentNode.next!! } currentNode.next = node return this } ...
  • 以前在单链表中我们删除一个结点,需要我们定义一个指针p来遍历整个链表,找到待删结点的前一个结点,使当前节点的next域指向待删结点的下一个结点,完成删除指定结点。如下图: 我们考虑一下这样的时间复杂度是...
  • 删除循环单链表中的开头节点,需要进行一些指针调整。在开头有三种从循环单链表删除节点的方案有以下几种。情况1 :(链表为空)如果链表为空...}情况2 :(链表包含单个节点)如果链表只包含一个节点,则条件head->...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,454
精华内容 12,581
关键字:

删除单链表的最后一个节点