单双链表

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;
}
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹏之翼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值