链表(一)单向链表

链表(Linked list):是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针,使其他们连接起来。

优点 :链表在内存中是分散的,使用链表结构可以克服需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。

缺点:链表失去了数组随机(随意)读取的优点,并且空间开销比较大(需要频繁的创建新的实例)

单向链表的实现与解析:

(1) 创建单向链表

单向链表是链表中结构最简单的。一个单链表的节点分为两个部分,第一个部分保存或者显示关于节点的信息,另一个部分存储下一个节点的地址。最后一个节点存储地址的部分指向空(null)

public class SingleLinkedList {
 private int size; //节点个数	
 private Node head;//头节点
 public SingleLinkedList(){
  size = 0;
  head = null;
 }
 class Node{
  private Object data;// 每个节点的数据
  private Node next;// 每个节点指向下一个节点的连接
  public Node(Object data) {
   this.data = data;
  }
 }
}

(2)添加节点

只需要将当前插入的节点设置为头节点,next指向原头节点即可

//添加 头节点 
 public void addHead(Object object) {
  Node node = new Node(object);
  if (size > 0) {
   node.next = head;
  }else{
   node.next = null;
  }
  head = node;
  size++;
 }

(3)删除节点

删除一个节点,我们只需将该节点的上一个节点的next指向该节点的下一个节点。

//删除头节点
 public Object delectHead() {
  Object object = head.data;
  head  = head.next;
  size--;
  return object;
 }

通过遍历找到需要删除的节点 ,判断是否是头节点若是直接将头节点指定为头节点的下一个
若不是该节点的上一个节点的next指向该节点的下一个节点。

 //删除指定节点
 public boolean delect(Object object) {
 if (size == 0) {
   return false;
  }
  Node lastNode = head;
  Node node = head;
  while (node.data != object) {
   if (node.next == null) {
    return false;
   }else {
    lastNode = node;
    node = node.next;
   }
  }
  //删除的是第一个节点
  if (lastNode == node) {
   head = head.next;
   size--;
  }else {
   lastNode.next = node.next;
   size--;
  }
  return  true;
 }

(4) 查找指定节点

通过头节点依次往下遍历,找到之后返回该节点

//查找指定节点
 public Node find(Object object) {
  Node node = head;
  int item = size;
  while (item > 0) {
   if (object.equals(node.data)) {
    return node;
   }else {
    node = node.next;
   }
   item--;
  }
  return null;
 }

(5)判断链表是否为空

//判断链表是否为空 
 public boolean isEmpty() {
  return(size == 0);
 }

(6)打印链表节点信息

循环输出链表个个节点

public void printNode() {
  if (size > 0) {
   Node node = head;
   if (size == 1) {
     System.out.println("["+node.data+"]");
     return;
   }
   int item = size;
   System.err.print("[");
   while (item > 0) {
    if (node.next == null) {
     System.err.print(node.data + "]");
    }else {
     System.err.print(node.data + ",");
    }
    node = node.next;
    item--;
   }
  }else {
   System.err.println("[]");
  }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值