面试---数据结构(3)(链表)
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)(链表)相关推荐
- 面试精选:链表问题集锦
原文:http://wuchong.me/blog/2014/03/25/interview-link-questions/ 链表问题在面试过程中也是很重要也很基础的一部分,链表本身很灵活,很考查编程 ...
- 6-4 链表拼接 (20分)_数据结构之链表
在面试过程中,数据结构和算法基本上算是研发类岗位必考的部分,而链表基本上又是数据结构中相对容易掌握.而且容易出题的部分,因此我们先整理一下链表部分的经典题目. (声明:以下所有程序都是用java编写) ...
- 数据结构之链表 - 动图演示
微信搜索[NO编程],关注这个与众不同的公众号. 个人网站:www.newobject.cc 版权声明:本文为原创文章,转载请注明出处. 链表简介 链表是很常见的数据结构,由一个个节点组成,每个节点中 ...
- Java数据结构之链表(单链表)
文章目录 一.链表 概念 结构 二.无头单链表 图解 代码实现 特点 三.带头单链表 为何引入带头单链表 代码实现 注意 提示:以下是本篇文章正文内容,Java系列学习将会持续更新 一.链表 概念 链 ...
- 数据结构之 链表( 单链表, 双链表,循环链表)
前篇.链表的概括 1.链表(Linked list)说明 是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按 ...
- c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出
C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...
- C/C++版数据结构之链表三
今天来讨论下链表中的双向链表. 双向链表: 概念:在双向链表中,结点除含有数据域外,还含有两个指针域:一个存储直接后继结点的地址,称为右链域:另一个存储直接前驱结点的地址,称为左链域. typedef ...
- 20175330 数据结构-单链表(选做)
要求 参见附件,补充MyList.java的内容,提交运行结果截图(全屏) 课下推送代码到码云 ``` public class MyList { public static void mai ...
- linux内核数据结构之链表
1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域.后来看代码注释发现该代码来自linux内核,在li ...
- python链表的创建_python数据结构之链表的实例讲解
在程序中,经常需要将组(通常是同为某个类型的)数据元素作为整体 管理和使,需要创建这种元素组,变量记录它们,传进传出函数等. 组数据中包含的元素个数可能发变化(可以增加或删除元素). 对于这种需求,最 ...
最新文章
- 解决“安装程序无法定位现有系统分区,也无法创建新的系统分区”的方法
- 伟世盾安助国电高级培训中心实现一网双管
- FFmpeg学习5:多线程播放视音频
- 跨链(8)Cosmos之“跨链交互协议IBC”
- 从零开始入门 K8s | 理解 RuntimeClass 与使用多容器运行时
- java小票_Java编程打印购物小票实现代码
- 线上问题随笔记录数据库连接池问题
- 【C++】C++类的学习(五)——纯虚函数与抽象类
- SAP ERP 安全管理平台系统
- happy 2016, happy 11111100000
- 聚类分析-K均值matlab(一)
- kylin 系列介绍
- 13.2 RS编码和纠错算法
- JVM学习笔记(13) 垃圾回收-相关概念
- 企业10大管理流程图,赶紧收藏!
- Java实现FTP下载文件到客户端(浏览器)
- 台式机网线连接笔记本通过wifi上网
- 德州学院计算机专业怎样,2017德州学院各专业录取分数线
- [人工智能]北美18名校的数据挖掘,数据分析,人工智能及机器学习课程汇总
- InstructGPT
热门文章
- 12.Unity2D 横版 TileMap随机生成简易横版瓦片地图+随机生成环境(花草树石)精灵图+2d-extras+协程的应用
- Js的执行机制(异步)
- 中国环卫服务行业投资趋势及前景动态战略性预测报告2022-2028年
- 专家视点︱张国华:“公交优先”,北京该做什么?
- linux dns 泛域名,linux配置从dns服务器泛域名解析负载均衡【实验】
- scanf返回值被忽略的原因及其解决方法
- HttpClient以及连接池的使用
- python办公自动化(七)xlwt和xlrd实现excel表格的批量合并和拆分
- 蒙氏数学作业纸全套数蒙氏教具蒙特梭利素材
- PaperTask.cn:做在线人工翻译 打造新语言生态