博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构之链表单向操作总结
阅读量:7110 次
发布时间:2019-06-28

本文共 4575 字,大约阅读时间需要 15 分钟。

链表是数据结构的基础内容之中的一个,以下就链表操作中的创建链表、打印链表、求取链表长度、推断链表是否为空、查找结点、插入结点、删除结点、逆转链表、连接链表、链表结点排序等进行总结。

1.创建表示结点的类,由于链表操作中须要比較结点,因此结点须要实现comparable接口。

public class Node implements Comparable
{ private Object data; private Node next; //构造函数 public Node() { this.data = null; this.next = null; } //构造函数重载 public Node(Object data) { this.data = data; this.next = null; } public Node(Object data, Node next) { this.data = data; this.next = next; } //读结点数据 public Object getData() { return data; } //写结点数据 public void setData(Object data) { this.data = data; } //获取结点链接的下一个点 public Node getNext() { return next; } //设置结点链接的下一个点 public void setNext(Node next) { this.next = next; } @Override public int compareTo(Node o) { if((Integer)this.data == (Integer)o.getData()) { return 0; } else { if((Integer)this.data < (Integer)o.getData()) { return -1; } else { return 1; } } }}
2.链表类例如以下。

public class Link{	/**	 * 链表头结点	 */	private Node m_headNode = null;	/**	 * 链表长度	 */	private int m_length = 0;		/**	 * 获取链表头结点	 * 	 * @return 链表头结点	 */	public Node getheadNode() {		return m_headNode;	}		/**	 * 获取链表长度	 * 	 * @return 链表长度	 */	public int getLength() {		return m_length;	}		/**	 * 对以head为头结点的链表中的各个元素进行打印输出	 * 	 * @param head 链表的头结点	 */	public void printLink() {		Node p = m_headNode;		while(p != null) {			System.out.print(p.getData() + " ");			p = p.getNext();		}		System.out.println();	}		/**	 * 用来创建一个链表,data数组中的数据相应链表中各个结点的data值	 * 	 * @param data 链表中各个结点的数据信息	 * @return 链表的头结点	 */	public Node createLink(Object[] data) {		Node headNode = null, r = null;		for(int i=0; i
m_length) { return 0; } int n = 0; Node p = m_headNode; while(p != null) { n++; if(n == pos) { Node node = new Node(data); node.setNext(p.getNext()); p.setNext(node); m_length++; return 1; } p = p.getNext(); } return 0; } /** * 删除链表中第一次出现数据为data的结点 * * @param data 被删除的结点数据 * @return 链表中存在该结点且删除成功,返回true。否则,返回false */ public boolean deleteNode(Object data) { if(m_headNode.getData() == data) { m_headNode = m_headNode.getNext(); m_length--; return true; } Node p = m_headNode, r = null; while(p != null) { if(p.getData() == data) { r.setNext(p.getNext()); m_length--; return true; } else { r = p; p = p.getNext(); } } return false; } /** * 删除链表中数据元素为data的全部结点 * * @param data 链表中被删结点的数据 */ public void deleteAllNode(Object data) { Node p = m_headNode.getNext(), r = m_headNode; while(p != null) { if(p.getData() == data) { r.setNext(p.getNext()); p = p.getNext(); m_length--; } else { r = p; p = p.getNext(); } } if(m_headNode.getData() == data) { m_headNode = m_headNode.getNext(); m_length--; } } /** * 逆转链表 */ public void invertLink() { Node p = m_headNode, r, q = null; while(p != null) { r = q; q = p; p = p.getNext(); q.setNext(r); } m_headNode = q; } /** * 将该链表链接在headLink之后 * * @param link 被链接的链表 * @throws NullPointerException 假设被链接的链表中一个结点都没有,抛出空指针异常 */ public void connectFrom(Link link) throws NullPointerException { if(link.getheadNode() == null) { throw new NullPointerException(); } else { Node p = link.getheadNode(), r = null; while(p != null) { r = p; p = p.getNext(); } r.setNext(m_headNode); m_headNode = link.getheadNode(); m_length += link.getLength(); } } /** * 在链表尾部追加link链表 * * @param link 须要追加的链表 */ public void connectTo(Link link) { Node p = m_headNode, r = null; while(p != null) { r = p; p = p.getNext(); } r.setNext(link.getheadNode()); m_length += link.getLength(); } /** * 对链表各结点数据从小到大排序 * * @throws NullPointerException 假设链表中一个结点都没有,则抛出空指针异常 */ public void sort() throws NullPointerException { if(m_headNode == null) { throw new NullPointerException(); } else { Node r = m_headNode, p = m_headNode.getNext(), q = null; int count = 1; while(p != null) { if(p.compareTo(r) == -1) { q = p; r.setNext(p.getNext()); p = p.getNext(); insert(q, count); } else { r = p; p = p.getNext(); } count++; } } } /** * 将结点p插入一个顺序排列的长度为length的链表中,使得插入结点p后的链表仍然顺序排列 * * @param p 须要插入的结点 * @param length 顺序排列的链表的长度 */ private void insert(Node p, int length) { if(p.compareTo(m_headNode) == -1) { p.setNext(m_headNode); m_headNode = p; } else { Node r = m_headNode.getNext(), q = m_headNode; for(int i = 2; i < length; i++) { if(p.compareTo(r) == 1) { q = r; r = r.getNext(); } else { q.setNext(p); p.setNext(r); return; } } q.setNext(p); p.setNext(r); } }}

转载地址:http://molhl.baihongyu.com/

你可能感兴趣的文章
CUDA程序设计(一)
查看>>
iOS随机颜色
查看>>
mybatis-generator自动生成dao,mapping,model
查看>>
阿里云服务器的坑=====部署EF+MVC
查看>>
docker学习笔记17:Dockerfile 指令 ONBUILD介绍
查看>>
MVC5 网站开发之七 用户功能 1、角色的后台管理
查看>>
To Miss Our Children Time(dp)
查看>>
Python学习笔记15—mysql的操作
查看>>
VisualSVN Server和Subversion的联系
查看>>
Gossip算法
查看>>
使用C#或javascript将Table里的数据导出到Excel
查看>>
单调栈小结
查看>>
将Tp-link无线路由器桥接到Dlink无线路由器上
查看>>
Div和Span标签显示与隐藏
查看>>
highcharts 结合phantomjs纯后台生成图片
查看>>
Eclipse上GIT插件EGIT使用手册之十二_重置功能
查看>>
阻塞自定义队列
查看>>
SVG报错error on line 39 at column 26: Namespace prefix xlink for href on script is not defined
查看>>
error: ‘for’ loop initial declarations are only allowed in C99 mode
查看>>
MySQL和Oracle开发差异
查看>>