2019独角兽企业重金招聘Python工程师标准>>>

public class DuLinkList<T> {// 定义一个内部类Node,Node实例代表链表的节点private class Node {// 保存节点的数据private T data;// 指向上个节点的引用private Node prev;// 指向下个节点的引用private Node next;public Node() {}public Node(T data, Node prev, Node next) {this.data = data;this.prev = prev;this.next = next;}}// 保存该链表的头节点private Node header;// 保存该链表的尾节点private Node tail;// 保存该链表中已包含的节点数private int size;// 创建空链表public DuLinkList() {header = null;tail   = null;}// 以指定数据元素来创建链表,该链表只有一个元素public DuLinkList(T element) {header = new Node(element, null, null);// 只有一个节点,header和tail都是nulltail = header;size++;}// 返回链表的长度public int length() {return size;}// 获取链式线性表中索引为index处的元素public T get(int index) {return getNodeByIndex(index).data;}// 根据索引index获取指定位置的节点private Node getNodeByIndex(int index) {if (index < 0 || index > size - 1) {throw new IndexOutOfBoundsException("线性表索引越界");}if (index <= size / 2) {// 从header节点开始Node current = header;for (int i = 0; i <= size / 2 && current != null; i++, current = current.next) {if (i == index) {return current;}}} else {// 从tail节点开始搜索Node current = tail;for (int i = size - 1; i > size / 2 && current != null; i--, current= current.prev) {if (i == index) {return current;}}}return null;}// 查找链式线性表中指定元素的索引public int locate(T element) {// 从头节点开始搜索Node current = header;for (int i = 0; i < size && current != null; i++, current = current.next) {if (current.data.equals(element)) {return i;}}return -1;}// 采用尾插法为链表添加新节点public void add(T element) {if (header == null) {header = new Node(element, null, null);// 只有一个节点,header、tail都指向该节点tail = header;} else {// 创建新节点,新节点的pre指向原tail节点Node newNode = new Node(element, tail, null);// 让尾节点的next指向新增的节点tail.next = newNode;// 以新节点作为新的尾节点tail = newNode;}size++;}// 采用头插法为链表添加新节点public void addAtHeader(T element) {// 创建新节点,让新节点的next指向原来的header,并以新节点作为新的headerheader = new Node(element, null, header);// 如果插入前是空链表if (tail == null) {tail = header;} else {header.prev = newNode;header = newNode;}size++;}// 向线性链式表的指定位置插入一个元素public void insert(T element, int index) {if (index < 0 || index > size) {throw new IndexOutOfBoundsException("线性表索引越界");}// 如果还是空链表if (header == null) {add(element);} else {// 当index为0时,也就是在链表头处插入if (index == 0) {addAtHeader(element);} else {// 获取插入点的前一个节点Node prev = getNodeByIndex(index - 1);// 获取插入点的节点Node next = prev.next;// 让新节点的next引用指向next节点,prev引用指向prev节点Node newNode = new Node(element, prev, next);// 让prev的next指向新节点prev.next = newNode;// 让prev的下一个节点的prev指向新节点next.prev = newNode;size++;}}}// 删除链式线性表中指定索引处的元素public T delete(int index) {if (index < 0 || index > size - 1) {throw new IndexOutOfBoundsException("线性表索引越界");}Node del = null;// 如果被删除的是header节点if (index == 0) {del = header;header = header.next;// 释放新的header节点的prev引用header.prev = null;del.next = null;} else {// 获取删除点的前一个节点Node prev = getNodeByIndex(index - 1);// 获取将要被删除的节点del = prev.next;// 让被删除节点前一个节点的next指向被删除节点的下一个节点prev.next = del.next;// 让被删除节点的下一个节点的prev指向prev节点if (del.next != null) {del.next.prev = prev;} else {tail = prev;}// 将被删除节点的prev、next引用赋为nulldel.prev = null;del.next = null;}size--;return del.data;}// 删除链式线性表中最后一个元素public T remove() {return delete(size - 1);}// 判断链式线性表是否为空链表public boolean empty() {return size == 0;}// 清空线性表public void clear() {// 将底层数据所有元素赋为nullheader = null;tail   = null;size   = 0;}public String toString() {// 链表为空链表时if (empty()) {return "[]";} else {StringBuilder sb = new StringBuilder("[");for (Node current = header; current != null; current = current.next) {sb.append(current.data.toString() + ", ");}int len = sb.length();return sb.delete(len - 2, len).append("]").toString();}}public String reverseToString() {// 链表为空链表时if (empty()) {return "[]";} else {StringBuilder sb = new StringBuilder("[");for (Node current = tail; current != null; current = current.prev) {sb.append(current.data.toString() + ", ");}int len = sb.length();return sb.delete(len - 2, len).append("]").toString();}}
}
public class DuLinkListTest {public static void main(String[] args) {DuLinkList<String> list = new DuLinkList<String>();list.insert("aaaa", 0);list.add("bbbb");list.insert("cccc",0);list.insert("dddd", 1);System.out.println("双向链式线性表增加元素后列表:" + list.toString());list.delete(2);System.out.println("双向链式线性表删除元素后列表:" + list.toString());System.out.println("双向链式线性表反置元素后列表:" + list.reverseToString());System.out.println("cccc在线性表中的位置:" + list.locate("cccc"));System.out.println("链表中索引1处的元素:" + list.get(1));list.remove();System.out.println("调用remove方法后的链表:" + list);list.delete(0);System.out.println("调用delete(0)后的链表:" + list);}
}

转载于:https://my.oschina.net/u/3545495/blog/1630442

【数据结构】线性表之双向链式线性表相关推荐

  1. php数据结构之线性表,php数据结构之顺序链表与链式线性表示例

    本文实例讲述了php数据结构之顺序链表与链式线性表.分享给大家供大家参考,具体如下: 链表操作 1. InitList(L):初始化链表 2. DestroyList(L):删除连接 3. Clear ...

  2. 线性表(双向)链式存储 - Java实现

    双向链式结构存储实现 package com.kiger.DeLink;/*** @ClassName DeLinkList* @Description 双向链表实现* @Author zk_kige ...

  3. Programming Ability Test学习 3-05. 求链式线性表的倒数第K项(15)

    3-05. 求链式线性表的倒数第K项(15) 时间限制 250 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 给定一系列正整数,请设计一个尽可能高效的算法, ...

  4. 求链式线性表的倒数第K项 (20 分)

    7-173 求链式线性表的倒数第K项 (20 分) 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整 ...

  5. PTA5-19 求链式线性表的倒数第K项

    5-19 求链式线性表的倒数第K项   (20分) 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数 ...

  6. 链式线性表和顺序线性表

    顺序线性表 顺序表的存储结构通常用一维数组来描述,数组的下标与元素在线性表中的序号相对应. 在这里插入代码片 线性表的存储结构: typedef struct {int elem[MAX_SIZE]; ...

  7. 拼题---求链式线性表的倒数第K项(两种算法的比较)

    7-17 求链式线性表的倒数第K项 (20 分) 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表 ...

  8. 1-6 求链式线性表的倒数第K项

    1-6 求链式线性表的倒数第K项 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数 ...

  9. 求链式线性表的倒数第K项(两种方法,第二种较好)

    求链式线性表的倒数第K项 题目 答案 第一种解法 第二种解法(较好) 注意 题目 答案 第一种解法 这种方法是正常输入,然后将链表逆置,虽然pta是可以通过的(写数组应该都能通过),但明显没有下一种好 ...

最新文章

  1. UBUNTU安装SSH和xrdp
  2. cmake重新编译matlab,ubuntu系统下cmake 编译matlab中mex文件
  3. HBase架构:HLog region store memstore compact storefile
  4. XCTF WEB backup
  5. vs2008 c++ 调用java
  6. alpha冲刺day8
  7. JavaScript eval() 函数,计算某个字符串,并执行其中的的 JavaScript 代码。
  8. STM32F7xx —— LAN8720(FreeRTOS+LWIP)
  9. 模拟Struts2实现
  10. sql视图 权限_SQLmysql用户权限管理
  11. c语言fopen函数读dat文件,C语言 从a.dat文件读入数据存入b.dat文件里面(以字符形式)...
  12. Python 多线程7-线程通信
  13. 在Win10系统中用mimikatz抓取明文密码
  14. 我为什么要弃医从(码)农
  15. 2020年10款网盘大比拼,总有一款适合你
  16. 2020年小米高级 PHP 工程师面试题
  17. iOS12-Swift5-Xcode10 Buildtime错误:/xx/Pods/Target Support Files/Pods-xx/Pods-xx.d
  18. postman模拟并发请求
  19. Eclipse搭建scala环境(解决“JDT weaving is currently disabled”)
  20. 搜狗SEO工具批量查询搜狗收录页面

热门文章

  1. 一段用于地址清洗的代码
  2. Quartz总结(四):动态修改定时器二
  3. ogg启动报错libnnz11.so: cannot open shared object file
  4. 离线抓取域登录缓存hash(mscash)
  5. Careercup | Chapter 3
  6. LVS_TUN 实验
  7. ibatis返回数据集映射举例
  8. 数据库基本SQL语句大全
  9. VirusTotal 共享8000万勒索软件样本分析数据库
  10. 苹果修复被 XCSSET 恶意软件滥用的3个 0day