1**除了用数组描述线性表还可以用链表描述线性表**
2在链式描述中,线性表的元素在内存中的存储位置是随机的。每个元素都有一个明确的指针或链指向线性表的下一个元素的位置(即地址)
*数组和链表的区别:
在数组中,元素的地址是由数学公式决定的,而在链式描述中,元素的地址是随机分布的
顺序表是顺序存储,非顺序存取,链表是非顺序存储。顺序存取
因此链式表便于插入,删除操作,不便于查询

3链表分为单向链表,双向链表和循环链表
首先用图片来说一下单向链表:

代码实现增删改查:

package com.tyxh.link;
//节点类
public class Node {protected Node next; //指针域protected int data;//数据域public Node( int data) {this. data = data;}//显示此节点public void display() {System. out.print( data + " ");}
}package com.tyxh.link;
//单链表
public class LinkList {public Node first; // 定义一个头结点private int pos = 0;// 节点的位置public LinkList() {this. first = null;}// 插入一个头节点public void addFirstNode( int data) {Node node = new Node(data);node. next = first;first = node;}// 删除一个头结点,并返回头结点public Node deleteFirstNode() {Node tempNode = first;first = tempNode. next;return tempNode;}// 在任意位置插入节点 在index的后面插入public void add(int index, int data) {Node node = new Node(data);Node current = first;Node previous = first;while ( pos != index) {previous = current;current = current. next;pos++;}node. next = current;previous. next = node;pos = 0;}// 删除任意位置的节点public Node deleteByPos( int index) {Node current = first;Node previous = first;while ( pos != index) {pos++;previous = current;current = current. next;}if(current == first) {first = first. next;} else {pos = 0;previous. next = current. next;}return current;}// 根据节点的data删除节点(仅仅删除第一个)public Node deleteByData( int data) {Node current = first;Node previous = first; //记住上一个节点while (current. data != data) {if (current. next == null) {return null;}previous = current;current = current. next;}if(current == first) {first = first. next;} else {previous. next = current. next;}return current;}// 显示出所有的节点信息public void displayAllNodes() {Node current = first;while (current != null) {current.display();current = current. next;}System. out.println();}// 根据位置查找节点信息public Node findByPos( int index) {Node current = first;if ( pos != index) {current = current. next;pos++;}return current;}// 根据数据查找节点信息public Node findByData( int data) {Node current = first;while (current. data != data) {if (current. next == null)return null;current = current. next;}return current;}
}package com.tyxh.link;
//测试类
public class TestLinkList {public static void main(String[] args) {LinkList linkList = new LinkList();linkList.addFirstNode(20);linkList.addFirstNode(21);linkList.addFirstNode(19);//19,21,20linkList.add(1, 22); //19,22,21,20linkList.add(2, 23); //19,22,23,21,20linkList.add(3, 99); //19,22,23,99,21,20linkList.displayAllNodes();
//        Node node = linkList.deleteFirstNode();
//        System.out.println("node : " + node.data);
//        linkList.displayAllNodes();
//        node = linkList.deleteByPos(2);
//        System.out.println("node : " + node.data);
//        linkList.displayAllNodes();
//        linkList.deleteFirstNode();Node node = linkList.deleteByData(19);
//        Node node = linkList.deleteByPos(0);System. out.println( "node : " + node. data);linkList.displayAllNodes();Node node1 = linkList.findByPos(0);System. out.println( "node1: " + node1. data);Node node2 = linkList.findByData(22);System. out.println( "node2: " + node2. data);}
}

再就是双向链表:

public class DoubleLinkedList
{  // 节点类Node  private static class Node  {  Object value;  Node prev = this;  Node next = this;  Node(Object v)  {  value = v;  }  public String toString()  {  return value.toString();  }  }  private Node head = new Node(null); // 头节点  private int size; // 链表大小  // 以下是接口方法  //添加到链表表头public boolean addFirst(Object o)  {  addAfter(new Node(o), head);  return true;  }  //将元素添加到链表表尾public boolean addLast(Object o)  {  addBefore(new Node(o), head);  return true;  }  public boolean add(Object o)  {  return addLast(o);  }  //将元素添加到指定位置public boolean add(int index, Object o)  {  addBefore(new Node(o), getNode(index));  return true;  }  //移除指定位置public boolean remove(int index)  {  removeNode(getNode(index));  return true;  }  //移除链表表头元素public boolean removeFirst()  {  removeNode(head.next);  return true;  }  //移除链表表尾元素public boolean removeLast()  {  removeNode(head.prev);  return true;  }  //取到指定位置的元素值public Object get(int index)  {  return getNode(index).value;  }  //返回链表的大小public int size()  {  return size;  }  public String toString()  {  StringBuffer s = new StringBuffer("[");  Node node = head;  for (int i = 0; i < size; i++)  {  node = node.next;  if (i > 0)  s.append(", ");  s.append(node.value);  }  s.append("]");  return s.toString();  }  //以下是实现方法  //查找链表元素private Node getNode(int index)  {  if (index < 0 || index >= size)  throw new IndexOutOfBoundsException();  Node node = head.next;  for (int i = 0; i < index; i++)  node = node.next;  return node; }  //在某元素之前添加元素private void addBefore(Node newNode, Node node)  {  newNode.prev = node.prev;newNode.next = node;newNode.next.prev = newNode;newNode.prev.next = newNode;size++;}  //在某元素之后添加元素private void addAfter(Node newNode, Node node)  {  newNode.prev = node;newNode.next = node.next;newNode.next.prev = newNode;newNode.prev.next = newNode;size++;}  //移除特定元素private void removeNode(Node node)  {  node.next.prev = node.prev;node.prev.next = node.next;node.prev = null;node.next = null;size--;}
}
//有些地方还可以优化,比如查找时可以判断索引是否大于size的一半,如果是的话,就从另一头开始迭代。  测试类
public class Test
{
public static void main(String[] args)
{  DoubleLinkedList dll = new DoubleLinkedList();  //添加  dll.add("A");  dll.add("B");  dll.add("C");  System.out.println(dll);  //添加到最前  dll.addFirst("D");  System.out.println(dll);  //添加到最后 dll.addLast("E");  System.out.println(dll);//添加到指定位置  dll.add(4, "F");  System.out.println(dll);  //移除最前的  dll.removeFirst();  System.out.println(dll);  //移除最后的  dll.removeLast();  System.out.println(dll);  //移除指定位置上的  dll.remove(2);  System.out.println(dll);  //返回指定位置上的元素  System.out.println(dll.get(1));  }
}
1

循环链表:

面试---数据结构(3)(链表)相关推荐

  1. 面试精选:链表问题集锦

    原文:http://wuchong.me/blog/2014/03/25/interview-link-questions/ 链表问题在面试过程中也是很重要也很基础的一部分,链表本身很灵活,很考查编程 ...

  2. 6-4 链表拼接 (20分)_数据结构之链表

    在面试过程中,数据结构和算法基本上算是研发类岗位必考的部分,而链表基本上又是数据结构中相对容易掌握.而且容易出题的部分,因此我们先整理一下链表部分的经典题目. (声明:以下所有程序都是用java编写) ...

  3. 数据结构之链表 - 动图演示

    微信搜索[NO编程],关注这个与众不同的公众号. 个人网站:www.newobject.cc 版权声明:本文为原创文章,转载请注明出处. 链表简介 链表是很常见的数据结构,由一个个节点组成,每个节点中 ...

  4. Java数据结构之链表(单链表)

    文章目录 一.链表 概念 结构 二.无头单链表 图解 代码实现 特点 三.带头单链表 为何引入带头单链表 代码实现 注意 提示:以下是本篇文章正文内容,Java系列学习将会持续更新 一.链表 概念 链 ...

  5. 数据结构之 链表( 单链表, 双链表,循环链表)

    前篇.链表的概括 1.链表(Linked list)说明 是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按 ...

  6. c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出

    C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...

  7. C/C++版数据结构之链表三

    今天来讨论下链表中的双向链表. 双向链表: 概念:在双向链表中,结点除含有数据域外,还含有两个指针域:一个存储直接后继结点的地址,称为右链域:另一个存储直接前驱结点的地址,称为左链域. typedef ...

  8. 20175330 数据结构-单链表(选做)

    要求 参见附件,补充MyList.java的内容,提交运行结果截图(全屏) 课下推送代码到码云 ``` public class MyList {     public static void mai ...

  9. linux内核数据结构之链表

    1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域.后来看代码注释发现该代码来自linux内核,在li ...

  10. python链表的创建_python数据结构之链表的实例讲解

    在程序中,经常需要将组(通常是同为某个类型的)数据元素作为整体 管理和使,需要创建这种元素组,变量记录它们,传进传出函数等. 组数据中包含的元素个数可能发变化(可以增加或删除元素). 对于这种需求,最 ...

最新文章

  1. 解决“安装程序无法定位现有系统分区,也无法创建新的系统分区”的方法
  2. 伟世盾安助国电高级培训中心实现一网双管
  3. FFmpeg学习5:多线程播放视音频
  4. 跨链(8)Cosmos之“跨链交互协议IBC”
  5. 从零开始入门 K8s | 理解 RuntimeClass 与使用多容器运行时
  6. java小票_Java编程打印购物小票实现代码
  7. 线上问题随笔记录数据库连接池问题
  8. 【C++】C++类的学习(五)——纯虚函数与抽象类
  9. SAP ERP 安全管理平台系统
  10. happy 2016, happy 11111100000
  11. 聚类分析-K均值matlab(一)
  12. kylin 系列介绍
  13. 13.2 RS编码和纠错算法
  14. JVM学习笔记(13) 垃圾回收-相关概念
  15. 企业10大管理流程图,赶紧收藏!
  16. Java实现FTP下载文件到客户端(浏览器)
  17. 台式机网线连接笔记本通过wifi上网
  18. 德州学院计算机专业怎样,2017德州学院各专业录取分数线
  19. [人工智能]北美18名校的数据挖掘,数据分析,人工智能及机器学习课程汇总
  20. InstructGPT

热门文章

  1. 12.Unity2D 横版 TileMap随机生成简易横版瓦片地图+随机生成环境(花草树石)精灵图+2d-extras+协程的应用
  2. Js的执行机制(异步)
  3. 中国环卫服务行业投资趋势及前景动态战略性预测报告2022-2028年
  4. 专家视点︱张国华:“公交优先”,北京该做什么?
  5. linux dns 泛域名,linux配置从dns服务器泛域名解析负载均衡【实验】
  6. scanf返回值被忽略的原因及其解决方法
  7. HttpClient以及连接池的使用
  8. python办公自动化(七)xlwt和xlrd实现excel表格的批量合并和拆分
  9. 蒙氏数学作业纸全套数蒙氏教具蒙特梭利素材
  10. PaperTask.cn:做在线人工翻译 打造新语言生态