/**
- 线性表的链式表示:
- 用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)
- 采用带虚拟头节点的链表
- @author hopefully
*/
public class _04linearList02<T> {
//内部类定义节点
public static class Node<T>{
public T data;
public Node<T> next;
//初始化指针域
private Node(Node<T> n) {
next=n;
}
//初始化指针域和数据域
private Node(T obj,Node<T> n) {
data=obj;
next=n;
}
//得到当前节点的数据域
public T getData() {
return data;
}
//得到当前节点的指针域
public Node<T> getNext(){
return next;
}
}
//链表的长度
private int length;
//链表的虚拟头节点
private Node<T> head;
//单链表初始化
public _04linearList02() {
//线性表为空
length=0;
head=new Node<T>(null);
}
//链表的长度
public int size() {
return length;
}
//线性表是否为空
public boolean isEmpty() {
return length==0;
}
//返回链表的头节点
public Node<T> getHead(){
return head;
}
//单链表的插入
public boolean add(T obj,int pos) {
if(pos<1||pos>length+1) {
System.out.println("pos值不合法");
return false;
}
int num=1;
//p指向待删除节点的前一个节点
Node<T> p=head;
while(num<pos) {
p=p.next;
num++;
}
Node<T> s=new Node<T>(obj, null);
s.next=p.next;
p.next=s;
length++;
return true;
}
//单链表的删除
public Node<T> delete(int pos){
if(isEmpty()) {
System.out.println("链表为空");
return null;
}
if(pos<1||pos>length) {
System.out.println("pos值不合法");
return null;
}
Node<T> p=head;
int num=1;
while(num<pos) {
p=p.next;
num++;
}
Node<T> res=p.next;
p.next=p.next.next;
length--;
return res;
}
//单链表的查找
public int find(T obj) {
if(isEmpty()) {
System.out.println("链表为空");
return -1;
}
Node<T> p=head.next;
int num=1;
while(p!=null) {
if(!p.data.equals(obj)) {
p=p.next;
num++;
}else {
return num;
}
}
return -1;
}
//获取单链表第pos个节点的值
public T value(int pos) {
if(isEmpty()) {
System.out.println("链表为空");
return null;
}
if(pos<1||pos>length) {
System.out.println("pos不合理");
return null;
}
int num=1;
Node<T> p=head.next;
while(num<pos) {
p=p.next;
num++;
}
return p.data;
}
//更新单链表第pos个节点的值
public boolean modify(T obj, int pos) {
if(isEmpty()) {
System.out.println("链表为空");
return false;
}
if(pos<1||pos>length) {
System.out.println("pos不合理");
return false;
}
int num=1;
Node<T> p=head.next;
while(num<pos) {
p=p.next;
num++;
}
p.data=obj;
return true;
}
//遍历单链表
public void iterator() {
Node<T> p=head.next;
while(p!=null) {
System.out.print(p.data+" ");
p=p.next;
}
System.out.println();
}
//清空单链表
public void clear() {
head.next=null;
length=0;
}
public static void main(String[] args) {
_04linearList02<Integer> singleLinkedList=new _04linearList02<Integer>();
System.out.println("链表的长度:");
System.out.println(singleLinkedList.size());
System.out.println("链表的头节点:");
Node<Integer> head = singleLinkedList.getHead();
System.out.println(head);
System.out.println(head.getData());
System.out.println(head.getNext());
singleLinkedList.add(2, 1);
singleLinkedList.add(8, 1);
singleLinkedList.add(9, 1);
singleLinkedList.add(1, 1);
singleLinkedList.add(15, 1);
singleLinkedList.add(20, 1);
singleLinkedList.iterator();
singleLinkedList.delete(3);
singleLinkedList.iterator();
int find = singleLinkedList.find(0);
System.out.println("find="+find);
}
}
转载请注明出处