Chapter202单链表

Chapter202单链表

内容来自: 数据结构教程: Java语言描述/李春葆,李筱驰主编.

1、线性表的链式存储结构——单链表

  • 单链表结点泛型类
public class LinkNode<E> {
             //单链表结点泛型类
    E data;
    LinkNode<E>next;
    public LinkNode(){
             //构造方法
        next = null;
    }
    public LinkNode(E d){
              //重载构造方法
        data = d;
        next = null;
    }
}
  • 单链表泛型类
public class LinkListClass<E> {
            //单链表泛型类
    LinkNode<E> head;           //存放头结点
    public LinkListClass(){
            //构造方法
      head = new LinkNode<E>();         //创建头结点
      head.next = null;         //头结点的next成员置为null
    }
    //基本运算算法
}

插入结点操作:

s.next = p.next; p.next = s;

删除结点操作:

p.next = p.next.next;

  • 用头插法整体建立单链表
public void createListF(E[] a)          //头插法:由数组a整体建立单链表
    {
   
        LinkNode<E> s;
        for(int i = 0; i < a.length; i++)           //循环建立数据结点s
        {
   
            s = new LinkNode<E>(a[i]);          //新建存放a[i]元素的结点s
            s.next = head.next;         //将s结点插入开始结点之前,头结点之后
            head.next = s;
        }
    }
  • 用尾插法整体建立单链表
public void createListR(E[] a)          //尾插法:由数组a整体建立单链表
    {
   
        LinkNode<E> s,t;
        t = head;           //t始终指向尾结点,开始时指向首结点
        for(int i = 0; i < a.length; i++)           //循环建立数据结点s
        {
   
            s = new LinkNode<E>(a[i]);          //新建存放a[i]元素的结点s
            t.next = s;         //将s结点插入t结点之后
            t = s;
        }
        t.next = null;          //将尾结点的next成员置为null
    }

2、线性表的基本运算在单链表中的实现

  • (1)查找返回序号为i的结点
public LinkNode<E> geti(int i)          //返回序号为i的结点
    {
   
        LinkNode<E> p = head;
        int j = -1;
        while(j < i){
   
            j++;
            p = p.next;
        }
        return p;
    }
  • (2)将元素e添加到线性表的末尾
public void add(E e)            //在线性表的末尾添加一个元素e
    {
   
        LinkNode<E> s = new LinkNode<E>(e);     //新建结点s
        LinkNode<E> p = head;
        while(p.next != null)           //查找尾结点p
            p = p.next;
        p.next = s;         //在尾结点之后插入结点s
    }
  • (3)求线性表的长度
public int size()           //求线性表的长度
    {
   
        LinkNode<E> p = head;
        int cnt = 0;
        while(p.next != null)           //找到尾结点为止
        {
   
            cnt+=;
            p = p.next;
        }
        return cnt;
    }
  • (4)设置线性表的长度
public void setSize(int nlen)           //设置线性表的长度
    {
   
        int len = size();
        if(nlen < 0 || nlen > len)
            throw new IllegalArgumentException("设置长度:n不在有效范围内");
        if(nlen == len) return;
        LinkNode<E> p = geti(nlen - 1);         //找到序号为nlen - 1的结点p
        p.next = null;          //将结点p置为尾结点
    }
  • (5)求线性表中序号为i的元素
public E getElem(int i)         //返回线性表中序号为i的元素
    {
   
        int len = size();
        if(i < 0 || i > len - 1)
            throw new IllegalArgumentException("查找:位置i不在有效范围内");
        LinkNode<E> p = geti(i);            //找到序号为i的结点p
        return (E)p.data;
    }
  • (6)设置线性表中序号为i的元素
public void setElem(int i, E e)         //设置序号为i的元素为e
    {
   
        if(i < 0 || i > size() - 1)
            throw new IllegalArgumentException("设置:位置i不在有效范围内");
        LinkNode<E> p = geti(i);            //找到序号为i的结点p
        p.data = e;
    }
  • (7)求线性表中第一个值为e的元素的逻辑序号
public int getNo(E e)           //查找第一个为e的元素的序号
    {
   
        int j = 0;
        LinkNode<E> p = head.next;
        
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值