数据结构——链表
来源:互联网 发布:python and 编辑:程序博客网 时间:2024/05/17 00:11
本篇文章主要是用做代码分享。代码,注释都写得很清楚,不清楚的可以问我,如果有些不对的地方也可以提出来,以便我及时改正。
接口类
//链表接口类(使用泛型)public interface ILinkList<E> { boolean isEmpty(); //判空 boolean isFull(); //判满 int length(); //计算链表长度 void insertAfter(Node<E> p, E x) throws Exception; //在指定节点p后面插入新元素 void insertBefore(Node<E> p, E x); //在指定结点p前面增加元素 void remove(Node<E> p) throws Exception; //删除元素 int removeAll(E x); //删除结点的单链表中的数据域为x的所有结点,返回被删除结点的个数 int search(E x); //按值查找操作 E getelement(int i) throws Exception; //按序号查找操作 void showList(); //遍历输出 void clear(); //清空表 void insertBefore(Node<E> p,Node<E> x); //在p结点的前面插入结点x void insertAfter(Node<E> p,Node<E> x); //在p结点的后面插入x结点 Node<E> search2(E x); //查找链表值为x的结点}
结点类
//结点类public class Node<E> { private E data; //数据域 private Node<E> next; //指针域 public Node(E data, Node<E> next) { super(); this.data = data; this.next = next; } public Node(E data) { super(); this.data = data; } public Node() { super(); } public E getData() { return data; } public void setData(E data) { this.data = data; } public Node<E> getNext() { return next; } public void setNext(Node<E> next) { this.next = next; }}
链表完成类
//单链表类public class LinkList<E> implements ILinkList<E>{ private Node<E> head; //头指针,指向第一个结点 //构造方法 public LinkList(Node<E> head) { super(); this.head = head; } public LinkList() { super(); } public Node<E> getHead() { return head; } public void setHead(Node<E> head) { this.head = head; } @Override public boolean isEmpty() { // 判空 return head == null; } @Override public boolean isFull() { // 判满,线性表永远不满,总有空间 return false; } @Override public int length() { // 求长度 int length = 0; Node<E> p = head; while(p != null){ length++; p = p.getNext(); } return length; } @Override public void insertAfter(Node<E> p, E x) throws Exception { // 在指定结点p后面插入数据x Node<E> s = new Node<E>(x, p.getNext()); p.setNext(s);// 若void改为Node<E>,则增加return s; } @Override public void insertBefore(Node<E> p, E x) { // 在指定节点p前面增加数据x Node<E> n = new Node<E>(x,p); //创建数据域为x的新结点,并指向p Node<E> q = head; if(p == head) //当p为第一个结点时 head = n; else{ while(q != null && q.getNext() != p) q = q.getNext(); q.setNext(n); } } @Override public void remove(Node<E> p) throws Exception { // 删除指定结点p Node<E> q = head; if(p == null) //先判断是否为空 return; if(p == head){ head = head.getNext(); return; } //q遍历到p的前一个 while(q.getNext() != null && q.getNext() != p) q = q.getNext(); if(q.getNext() == p){ q.setNext(p.getNext()); return; } } @Override public int removeAll(E x) { // 删除结点的单链表中的数据域为x的所有结点,返回被删除结点的个数 Node<E> p = head.getNext(); Node<E> q = head; int count = 0; while(p != null){ if(p.getData().equals(x)){ q.setNext(p.getNext()); count++; }else q = p; p = p.getNext(); } return count; } @Override public int search(E x) { // 查找数据域为x的节点并返回下标 int count = 0; Node<E> p = head; while(p != null && !p.getData().equals(x)){ p = p.getNext(); count++; } if(p == null) return -1; return count; } @Override public E getelement(int i) throws Exception { // 按序号查找数据操作 Node<E> p = head; int j = 0; while(p != null && j < i){ p = p.getNext(); j++; } if(j > i || p == null) throw new Exception("第" + j + "个元素不存在!"); return p.getData(); } @Override public void showList() { // 遍历输出 Node<E> p = head; while(p != null){ System.out.print(p.getData() + " "); p = p.getNext(); } System.out.println(); } @Override public void clear() { // 清空表 head = null; } @Override public void insertBefore(Node<E> p, Node<E> x) { // 在p结点的前面插入结点x if (p==head){ head=x; x.setNext(p); return; } Node<E> q=head; while(q.getNext()!=null&&q.getNext()!=p){ q=q.getNext(); } //查找成功时, q为p的前一个结点 if (q.getNext()==p){//可能有不存在结点p的情况,如果存在,则进行下面的处理 q.setNext(x); x.setNext(p); } } @Override public void insertAfter(Node<E> p, Node<E> x) { // 在p结点的后面插入x结点 x.setNext(p.getNext()); p.setNext(x); } @Override public Node<E> search2(E x) { // 查找链表值为x的结点 Node<E> p = head; while (p != null && !p.getData().equals(x)) { p = p.getNext(); } return p; }}
测试类
public class TestLinkList01 { public static void main(String[] args) throws Exception { final int LENGTH = 5; //链表的初始长度 LinkList<Integer> link = new LinkList<Integer>(); //创建由随机数构成的链表 Node<Integer> p = new Node<Integer>((int)(Math.random()*LENGTH)+1); link.setHead(p); for(int i = 1; i < LENGTH; i++){ Node<Integer> x = new Node<Integer>((int)(Math.random() * LENGTH) + 1); p.setNext(x); p = x; } link.showList(); System.out.println("表中数据长度是:" + link.length()); System.out.println(link.isEmpty()); System.out.println(link.isFull()); System.out.println(link.search(2)); int x = 2; Object q = link.getelement(x); System.out.println("下标为2的数据是:" + q);// if (p!=null){// //显示该结点及后继结点的数据// System.out.println("查找结果:"+p.getData()+"--->"+(p.getNext()==null?"":p.getNext().getData()));// //删除此结点// link.remove(p);// System.out.println("删除结点后:");// link.showList();// } Node<Integer> s = new Node<Integer>(508,p.getNext()); link.insertAfter(p, s); link.showList(); link.remove(p); link.showList(); link.clear(); link.showList(); }}
范例一
public class PhoneNumber { private String company; private String phone; public PhoneNumber(String company, String phone) { super(); this.company = company; this.phone = phone; } public PhoneNumber() { super(); } public String getCompany() { return company; } public void setCompany(String company) { this.company = company; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public String toString() { return "[company=" + company + ", phone=" + phone + "]"; } @Override public boolean equals(Object p) { return this.company.equals(((PhoneNumber)p).getCompany()); }}
范例一测试类
import java.util.Scanner;public class TestLinkList02 { public static void main(String[] args){ final int LEN=5; Scanner sc=new Scanner(System.in); LinkList<PhoneNumber> phoneLink=new LinkList<PhoneNumber>(); System.out.println("请输入第1个结点的数据(PhoneNum类型):"); Node<PhoneNumber> p=new Node<PhoneNumber>(new PhoneNumber(sc.next(),sc.next())); phoneLink.setHead(p); for(int i=1;i<LEN;i++){ System.out.println("请输入第"+(i+1)+"个结点的数据(PhoneNum类型):"); Node<PhoneNumber> x=new Node<PhoneNumber>(new PhoneNumber(sc.next(),sc.next())); p.setNext(x); p=x; } phoneLink.showList(); phoneLink.insertBefore(phoneLink.getHead(), new Node(new PhoneNumber("星星","400-578345"))); System.out.println("表中共有"+phoneLink.length()+"个企业的信息."); phoneLink.showList(); p=phoneLink.search2(new PhoneNumber("星星",null)); if (p!=null){ System.out.println("查找结果:"+p.getData().getPhone()); }else System.out.println("未找到企业名称为星星的信息."); }}
阅读全文
0 0
- 数据结构——链表
- 数据结构——链表
- 数据结构——链表
- 数据结构——链表
- 数据结构——链表
- 数据结构——链表
- 数据结构——链表
- 数据结构——链表
- 数据结构——链表
- 数据结构—链表List
- linux数据结构—链表
- 数据结构—链表
- 数据结构—链表-双链表
- 数据结构——什么是数据结构
- 【大话数据结构】——-数据结构
- 数据结构 —— 数据结构概述
- [数据结构]数据结构——链表法
- 内核数据结构——链表
- Python学习手册1-模块
- 搜狗实习面试总结
- CSU-ACM2017暑期训练3-递推与递归I
- Linux常用命令--文件管理一
- 基于numpy+pandas的单层神经网络
- 数据结构——链表
- 分类型的listview
- 软件安装
- FZU 2275 Game (KMP)
- django实现用户登陆功能
- (贪心)Codeforces Round #402 B. Weird Rounding
- 1.回看JAVA之变量类型
- Spiral Matrix问题及解法
- HDU6045-Is Derek lying?