文章目录
一、链表实现结构
一个接口ILink
一个linkImpl类实现接口
LinkImpl中封装一个内部类Node来实现链表的挂载
1.接口
interface ILink{
void add(Object data);
boolean remove(Object data);
int contains(Object data);
void clear (Object data);
Object set(int index,Object newData);
Object get(int index);
int size();
Object[] toArray();
void printList();
}
2.LinkImpl类
class linkImpl implements ILink{
private Node first;
private Node last;
int size = 0;
private class Node{
private Node prev;
private Object data;
private Node next;
public Node(Node prev,Object data,Node next){
this.prev = prev;
this.data = data;
this.next = next;
}
}
@Override
public void clear(Object data){ }
@Override
public void add(Object data) { }
@Override
public boolean remove(Object data) { }
@Override
public int contains(Object data) { }
@Override
public Object set(int index, Object newData) { }
@Override
public Object get(int index) { }
@Override
public int size() { }
@Override
public Object[] toArray() { }
@Override
public void printList() { }
}
二、方法实现
1.添加节点
public void add(Object data) {
Node temp = this.last;
Node newNode = new Node(temp, data, null);
this.last = newNode;
if (this.first == null) {
this.first = newNode;
}
else {
temp.next = newNode;
}
this.size++;
}
2.删除指定节点
public boolean remove(Object data) {
if(data == null){
for(Node temp = this.first;temp!= null;temp = temp.next){
if(temp.data == null){
//删除
unLink(temp);
return true;
}
}
}else{
for(Node temp = this.first;temp!=null;temp=temp.next){
if(data.equals(temp.data)){
//删除
unLink(temp);
return true;
}
}
}
return false;
}
//返回删之前的对象
private Object unLink(Node x){
Object elementData = x.data;
Node prev = x.prev;
Node next = x.next;
if(prev == null){
this.first = next;
}else{
prev.next = next;
x.prev = null;
}
if(next == null){
this.last = prev;
}else{
next.prev = prev;
x.next = null;
}
x.data = null;
this.size--;
return elementData;
}
3.清空链表
public void clear(Object data){
for(Node x = this.first;x!= null;){
Node temp = x.next;
x.prev = x.next = null;
x = temp;
}
this.first = this.last = null;
size = 0;
}
4.判断一个对象是否存在于该链表
public int contains(Object data) {
if(data == null){
int index = 0;
for(Node x = this.first;x.data != null;x = x.next){
if(x.data == null){
return index;
}
index ++;
}
return -1;
}
else{
int index = 0;
for(Node x = this.first;x.data != null;x=x.next){
if(data.equals(x.data)){
return index;
}
index++;
}
return -1;
}
}
5. set和get方法
public Object set(int index, Object newData) {
if(!isLinkElement(index)){
return null;
}
Node node = node(index);
node.data = newData;
return node;
}
public Object get(int index) {
if(!isLinkElement(index)){
return null;
}
return node(index).data;
}
辅助方法
private Node node(int index){
if(index<(size>>1)){
Node result = this.first;
for(int i = 0;i<index;i++){
result = result.next;
}
return result;
}
Node result = this.last;
for(int i = size-1; i>index;i--){
result = result.prev;
}
return result;
}
private boolean isLinkElement(int index){
return (index >=0) && (index<this.size);
}
6.求链表长度
public int size() {
return this.size;
}
7.将链表转为对象数组
public Object[] toArray() {
Object[] result = new Object[size];
int i = 0;
for(Node temp = this.first;temp!=null;temp = temp.next){
result[i++] = temp.data;
}
return result;
}
8.打印链表
public void printList() {
Object[] result = this.toArray();
for(Object obj:result){
System.out.println(obj);
}
}