单链表中非常重要的操作

取值:取单链表中第i个元素的内容


  • 思考:顺序表中如何找到第i个元素?

  • 【算法思路】从首元结点开始遍历每个结点,并且利用计数变量进行计数

  • 【算法描述】

    Status GetElem_L(LinkList L,int i,ElemType &e){
      // 首先是判断传入的i是否合理
      if(i<0||i>getLength(L)){
        	return ERROR;
      }
      LinkList p=L->next;  // p指针此时指向首元结点
      // 开始遍历链表
     	while(p&&i!=1){
        	i--;
        	p=p->next;
      }
      e=p->data;
      return OK;
    }
    

按值查找——根据指定数据获取该数据所在位置


  • 【算法思路】从首元结点开始遍历链表,将每个结点中的数据域存储的值与之比较,并且返回i即可。

  • 【算法描述】

    int getIndex_L(LinkList L,ElemType e){
      	LinkList p=L->next;
      	int i=1;  		// 计数器
      	// 开始遍历链表
      	while(p&&e!=p->data){
          ++i;
          p=p->next;   // 移动指针指向结点
        }
      	if(p)
          	return ERROR;
      	return i;
    }
    

插入——在第i个结点前插入值为e的新结点


  • 【算法思路】这里是将插入第i个结点之前,同时也需要找到第i-1个结点,然后插入到两者之间。

  • 【算法步骤】

    • 首先是找到第i-1个结点位置p
    • 生成一个数据域为e的新结点s
    • 插入新结点:1、新结点的指针域指向结点Ai
      2、结点Ai-1的指针域指向新结点
  • 【算法描述】

    Status InsertElem(LinkList L,ElemType e,int i){
      	// 首先是判断i是否合理
      	if(i>getLength(L)||i<=0){
          	return ERROR;
        }
      
      	LinkList p=L->next;
      	// 找到第i-1个结点位置
      	while(p&&i!=2){
          	p=p->next;
            --i;
        }
      	// 生成新结点,并且将数据存储在数据域中
      	Lnode s;
       	s->data=e;
      	// 将新结点的指针域指向第i个结点,第i-1个指针域指向新结点
      	s->next=p->next;
      	p->next=s;
      	return OK;
    }
    
  • 【思考】能否先第i-1个结点的指针指向新结点,后新结点的指针域指向第i个结点

删除:删除第i个结点操作


  • 【算法思路】

  • 【算法步骤】
    1、首先找到第i-1个结点的存储位置p,保存要删除的第i个结点的值
    2、令p->next指向第i+1个结点位置
    3、删除保存的结点的值,并且释放空间即可。

  • 【算法描述】

    Status DeleteElem(LinkList &L,int i,ElemType &e){
      	// 首先是判断i是否合理
      	if(i>getLength(L))
          	return ERROR;
      	LinkList p=L;
      	// 找到第i-1个结点位置,这里偷了个懒,运用i为计数器
      	while(p->next&&i>2){
          	i--;
          	p=p->next;
        }
      	
      	LinkList q=p->next; // q变量来存储第i个元素
      	e=q->data;
      	delete q;
      	return OK;
    }
    

单链表的查找、插入、删除算法的时间效率


  1. 查找:
    因为线性链表只能顺序存取,即在查找时要从头指针找起,查找时间复杂度为O(n)
  2. 插入和删除
    因为线性链表不需要移动元素,只要修改指针,一般情况下时间复杂度为O(1)
posted @   什么都会有的  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示