天天看点

单双链表

MyList接口

public interface<T> extends Iterator<T>{
	public void add(T element);//添加元素element
	public void delete(T element);//删除指定元素
	public void delete(int index);//按照索引删除元素
	public int indexOf(T element);//返回元素索引
	public boolean contains(T element);//是否存在元素element
	public void update(int index,T newElement);//将指定位置元素置换为newElement
	T getElem(int index);//返回index处位置的元素
}
           

ListNode节点

public class ListNode{
	public Object data;//存储的元素
	ListNode pre;//前驱
	ListNode next;//后继
	public ListNode(Object data){//构造函数
		this.data=data;
}
}
           

SingleLinkedList

public class SingleLinkedList<T>implements MyList<T>{
	private ListNode first;//头节点
	private ListNode last;//尾节点
	private int size;//单链表长度
@Override
public void add(T element){
	if(first==null){
		first=new ListNode(element);//生成新节点
		last=first;
}
	else{
		last.next=new ListNode(element);//生成新节点,追加在表尾
		last=last.next;
}
		size++;//表大小加1
}
@Override
public void delete(T element){
	ListNode p=first;
	ListNode pre=null;
	while(p!=null){
		if(p.data.equals(element)){
			if(p==first)first=first.next;
			else{
				pre.next=p.next;//改变指针的指向完成删除
				size--;
				break;
}
}
		pre=p;
		p=p.next;

		
}
}
@Override
public void delete(int index){
	ListNode p=first;
	ListNode pre=null;
	int i=0;
	if(index<0||index>size)//范围错误
	{
		return;
}
	while(p!=null){
		if(i==index){//找到元素
			if(p==first)first=first.next;
			else{
				pre.next=p.next;//改变指针指向删除成功
				size--;
				break;//删除成功
}
			pre=p;
			p=p.next;
			i++;
}	
}
}
@Override
public int indexOf(T element){
	int i=0;
	ListNode p=first;
	while(p!=null){
		if(p.data.equals(element))return i;//存在元素返回该位置索引
		p=p.next;
		i++;
}
	return -1;
}
@Override
public void update(int index,T newElement){
	int i=0;
	ListNode p=first;
	if(index<0||index>size)return;//范围错误
	while(p!=null){
		if(i==index)p.data=newElement;//指定位置元素设为newElement
		p=p.next;
		i++;
}	
}
@Override
public boolean contains(T element){
	ListNode p=first;
	while(p!=null){
		if(p.data.equals(element))return true;//存在元素
		p=p.next;
}
	return false;
}
@Override
public T getElem(int index){
	ListNode p=first;
	int i=0;
	while(p!=null){
		if(i==index)return (T)p.data;//返回index处位置元素
		p=p.next;
		i++;
}
	return null;
}
@Override
public String toString(){
	ListNode p=first;
	StringBuilder sb=new StringBuilder("[");
	while(p!=null){
		sb.append(p.data);
		if(p.next!=null)sb.append(",");
		p=p.next;
}
	sb.append("]");
	return sb.toString();
}
@Override
public boolean hasNext(){
	ListNode p=first;
	return p!=null;
}
@Override
public T next(){
	ListNode str=first;
	first=first.next;
	return (T)str.data;
}
}
           

DoubleLinkedList实现:

public class DoubleLinkedList<T> implements MyList<T>{
	private ListNode first=new ListNode(null);
	private ListNode last=new ListNode(null);
	private int size;
	public DoubleLinkedList(){
		first.next=last;
		last.pre=first;
}
@Override 
public void add(T element){
	ListNode newNode=new ListNode(element);	
		last.pre.next=newNode;
		newNode.pre=last.pre;
		newNode.next=last;
		last.pre=newNode;
		size++;
}
@Override
public void delete(T element){
	ListNode p=first.next;
	while(p!=last){
		if(p.data.equals(element)){
			p.pre.next=p.next;
			p.next.pre=p.pre;
			p.next=null;
			p.pre=null;
			size--;
			break;
}
		p=p.next;
}
}
@Override
public void delete(int index){
	int i=0;
	ListNode p=first.next;
	while(p!=last){
		if(i==index){
			p.pre.next=p.next;
			p.next.pre=p.pre;
			p.next=null;
			p.pre=null;
			size--;
			break;	
}
		p=p.next;
		i++;
}
}
@Override
public void update(int index,T newElement){
if(index<0||index>size){
		return;
}
	ListNode p=first.next;
	int i=0;
	while(p!=last){
		if(i==index){
			p.data=newElement;
}	
			i++;
			p=p.next;
}
}
@Override
public boolean contains(T element){
	ListNode p=first.next;
	while(p!=last){
		if(p.data.equals(element))return true;
		p=p.next;
}
	return false;
}
@Override
public int indexOf(T element){
	ListNode p=first.next;
	int i=0;
	while(p!=last){
		if(p.data.equals(element)){
			return i;
}
	p=p.next;
	i++;
}
return -1;
}
@Override 
public T getElem(int index){
	ListNode p=first.next;
	int i=0;
	while(p!=last){
		if(i==index)return (T)p.data;
		i++;
		p=p.next;
}
return null;
}
@Override
public String toString(){
	StringBuilder sb=new StringBuilder("[");
	ListNode p=first.next;
	while(p!=last){
		sb.append(p.data);
		if(p.next!=null)sb.append(",");
		p=p.next;
}
sb.append("]");
return sb.toString();
}
ListNode p=first;
@Override
public boolean hasNext(){
	return p.next!=last;
}
@Override
public T next(){
	ListNode next=p.next;
	p=p.next;
	return(T)next.data;
}
}
           

双链表只是比单链表多了一个指向前驱的指针,删除操作比单链表麻烦一点,其他操作基本类似

继续阅读