packagecom.clarck.datastructure.linked;/*** 线性表的链式表示和实现 带头结点的单链表类,实现线性表接口
*
*@authorclarck
*
*@param*/
public class SinglyLinkedList implements LList{/*** 头指针,指向单链表的头结点*/
public Nodehead;/*** 默认构造方法,构造空单链表*/
publicSinglyLinkedList() {//创建头结点,data和next值均为null
this.head = new Node();
}/*** 由指定数组中的多个对象构造单链表。采用尾插入构造单链表
* 若element==null,Java将抛出空对象异常;若element.length==0,构造空链表
*
*@paramelement*/
publicSinglyLinkedList(T[] element) {//创建空单链表,只有头结点
this();//rear指向单链表最后一个结点
Node rear = this.head;for (int i = 0; i < element.length; i++) {
rear.next= new Node(element[i], null);
rear=rear.next;
}
}/*** 判断单链表是否空,O(1)*/@Overridepublic booleanisEmpty() {return this.head.next == null;
}/*** 返回单链表长度,O(n), 基于单链表遍历算法*/@Overridepublic intlength() {int i = 0;//p从单链表第一个结点开始
Node p = this.head.next;//若单链表未结束
while (p != null) {
i++;//p到达后继结点
p =p.next;
}returni;
}/*** 返回第i(≥0)个元素,若i<0或大于表长则返回null,O(n)*/@Overridepublic T get(inti) {if (i >= 0) {
Node p = this.head.next;for (int j = 0; p != null && j < i; j++) {
p=p.next;
}//p指向第i个结点
if (p != null) {returnp.data;
}
}return null;
}/*** 设置第i(≥0)个元素值为x。若i<0或大于表长则抛出序号越界异常;若x==null,不操作。O(n)*/@Overridepublic void set(inti, T x) {if (x == null)return;
Node p = this.head.next;for (int j = 0; p != null && j < i; j++) {
p=p.next;
}if (i >= 0 && p != null) {
p.data=x;
}else{throw new IndexOutOfBoundsException(i + "");
}
}/*** 插入第i(≥0)个元素值为x。若x==null,不插入。 若i<0,插入x作为第0个元素;若i大于表长,插入x作为最后一个元素。O(n)*/@Overridepublic void insert(inti, T x) {//不能插入空对象
if (x == null) {return;
}//p指向头结点
Node p = this.head;//寻找插入位置
for (int j = 0; p.next != null && j < i; j++) {//循环停止时,p指向第i-1结点或最后一个结点
p =p.next;
}//插入x作为p结点的后继结点,包括头插入(i<=0)、中间/尾插入(i>0)
p.next = new Node(x, p.next);
}/*** 在单链表最后添加x对象,O(n)*/@Overridepublic voidappend(T x) {
insert(Integer.MAX_VALUE, x);
}/*** 删除第i(≥0)个元素,返回被删除对象。若i<0或i大于表长,不删除,返回null。O(n)*/@Overridepublic T remove(inti) {if (i >= 0) {
Node p = this.head;for (int j = 0; p.next != null && j < i; j++) {
p=p.next;
}if (p != null) {//获得原对象
T old =p.next.data;//删除p的后继结点
p.next =p.next.next;returnold;
}
}return null;
}/*** 删除单链表所有元素 Java将自动收回各结点所占用的内存空间*/@Overridepublic voidremoveAll() {this.head.next = null;
}/*** 顺序查找关键字为key元素,返回首次出现的元素,若查找不成功返回null
* key可以只包含关键字数据项,由T类的equals()方法提供比较对象相等的依据*/@OverridepublicT search(T key) {if (key == null)return null;for (Node p = this.head.next; p != null; p =p.next)if(p.data.equals(key))returnp.data;return null;
}/*** 返回单链表所有元素的描述字符串,形式为“(,)”,覆盖Object类的toString()方法,O(n)*/@OverridepublicString toString() {
String str= "(";for (Node p = this.head.next; p != null; p =p.next) {
str+=p.data.toString();if (p.next != null)
str+= ","; //不是最后一个结点时后加分隔符
}return str + ")"; //空表返回()
}/*** 比较两条单链表是否相等*/@SuppressWarnings("unchecked")
@Overridepublic booleanequals(Object obj) {if (obj == this)return true;if (obj instanceofSinglyLinkedList) {
SinglyLinkedList list = (SinglyLinkedList) obj;return equals(this.head.next, list.head.next);
}return false;
}/*** 比较两条单链表是否相等,递归方法
*
*@paramp
*@paramq
*@return
*/
private boolean equals(Node p, Nodeq) {return p == null && q == null || p != null && q != null
&& p.data.equals(q.data) &&equals(p.next, q.next);
}
}
java双链接程序按升序排列 java升序排序单链表
转载文章标签 java双链接程序按升序排列 升序单向链表 java 链表 结点 ide 文章分类 Java 后端开发
-
2.单链表逆置
单链表逆置
单链表逆置 List