对链表的 操作

package com.test;
/*
 * 1、链表类
 * 2、一个构造方法,一个显示方法
 * */
public class Link {
	public int iData;
	public Link next;
	public Link previous;
	public Link(int id){
		iData = id;
	}
	public void displayLink(){
		System.out.println(iData+"---");
	}
}

双向链表:

package com.test;

/*
 * 双向链表
 * 
 *  3=current.pre   4=current  5=current.next
 * *****************************
 * | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
 * *****************************
 * */
public class DoublyLinkedList {
	private Link firstLink;
	private Link lastLink;
	
	public DoublyLinkedList(){
		firstLink = null;
		lastLink = null;
	}
	public boolean isEmpty(){
		return firstLink == null ;
	}
	public void insertFirst(int id){
		Link newLink = new Link(id);
		if(isEmpty()){					
			lastLink =newLink;			//若if成立 则必须给lastLink 赋值
		}else{							
			firstLink.previous = newLink;		//让第一个连接点的前一个连接点 等于 新的连接点
			newLink.next = firstLink;			//让新的连接点的下一个连接点 等于 第一个连接点			
		}
		firstLink = newLink;			//给第一个连接点赋值
	}
	public void insertLast(int id){
		Link newLink = new Link(id);
		if(isEmpty()){
			firstLink = newLink;		//若链表为空则让新的连接点 等于 第一个连接点等于
		}else{			
			lastLink.next = newLink;
			newLink.previous = lastLink;	
		}
		lastLink = newLink;
	}
	//在当前节点后面插入新的连接点
	public boolean insertAfter(int key,int id){
		Link current = firstLink;
		while (current.iData != key) {      //循环链表 当current = key时跳出循环
			current = current.next;
			if(current == null){
				return false;
			}
		}
		Link newLink = new Link(id);
		if(current == lastLink){			//当current = lastLink时
			newLink.next = null;
			lastLink = newLink;
		}else{								//否则
			newLink.next = current.next;	//新连接点的下一个 指向 当前连接点的下一个 
			current.next.previous = newLink;//当前连接点的前一个连接点 等于 新的连接点
		}
		newLink.previous = current;			//新的连接点的前一个连接点 等于 当前连接点
		current.next = newLink;				//当前连接点的下一个 等于 新的连接点
		return true;		
	}
	public Link deleteFirst(){
		Link tempLink = firstLink;
		if(firstLink.next == null){
			lastLink = null;
		}else{
			firstLink.next.previous = null;
			firstLink = firstLink.next;
		}	
		return tempLink;
	}	
	public Link deleteLast(){
		Link tempLink = lastLink;
		if(lastLink.previous == null){
			firstLink = null;
		}else{
			lastLink.previous.next = null;
			lastLink = lastLink.previous;
		}
		return tempLink;
	}
	public Link deleteKey(int key){
		Link current = firstLink;
		while (current.iData!=key) {
			current = current.next;
			if(current == null){
				return null;
			}
		}
		if(current == firstLink){			//当删除的等第一个连接点是
			firstLink = current.next;
		}else{
			current.previous.next = current.next; //被删除节点的前一个连接点指向被删除连接点的后一个连接点
		}
		if(current == lastLink){
			lastLink = current.previous;
		}else{
			current.next.previous = current.previous;//被删除节点的下一个连接点节点指向被删除节点的前一个连接点
		}
		return current;
	}
	public void displayForward(){
		System.out.println("List---(first--->last)");
		Link currentLink = firstLink;
		while(currentLink != null) {
			currentLink.displayLink();
			currentLink = currentLink.next;		
		}		
	}
	public void displayBackward(){
		System.out.println("List---(last--->first)");
		Link currentLink = lastLink;
		while (currentLink != null) {
			currentLink.displayLink();
			currentLink = currentLink.previous;
		}
	}
	public static void main(String[] args) {
		DoublyLinkedList list = new DoublyLinkedList();
		list.insertFirst(1);
		list.insertFirst(2);
		list.insertFirst(3);
		list.insertLast(4);
		list.insertLast(5);
		list.insertLast(6);
		list.displayForward();
		list.displayBackward();
		list.insertAfter(1, 7);
		list.displayForward();
		Link linkFirstLink = list.deleteFirst();  //在删除的时候应该先判断链表是否为空,此处省略
		System.out.println("deleteFirst--->"+linkFirstLink.iData);
		Link linkLastLink = list.deleteLast();
		System.out.println("deleteLast---->"+linkLastLink.iData);
		Link linkDeleteKey = list.deleteKey(1);
		System.out.println("delteKey------>"+linkDeleteKey.iData);
		

	}	
}

双端链表:

package com.test;
/*
 * 双端链表
 * 1、删除不掉最后一个连接点
 * */
public class FirstLastList {
	public Link first;
	public Link last;
	public FirstLastList(){
		first = null;
		last = null;
	}
	public boolean isEmpty(){
		return first == null;		
	}
	public void insertFirst(int id){
		Link newLink = new Link(id);
		if(isEmpty()){
			last = newLink;		若Link 为空 则insertFirst 将last指向新的连接点
		}
		newLink.next = first;
		first = newLink;		// 将新插入的值赋给链表中的第一个数
	}
	public void insertLast(int id){
		Link newLink = new Link(id);
		if(isEmpty()){
			first = newLink;	//若Link 为空 则insertLast 将first指向新的连接点
		}else{
			last.next = newLink;
		}
		last = newLink;			//将新插入的值赋给链表中最后一个数
	}
	//插入排序
	public void insert(Link k){
		Link previous = null;	//从表头开始
		Link current = first;
		while (current!=null && k.iData < current.iData ) {
			previous = current;			
			current = current.next;
			
		}
		if(previous == null){	//如果要插入的数在表头
			first = k;
		}else{					//如果要插入的数不在表头
			previous.next = k;
		}
		k.next = current;
	}
	public Link deleteLink(){
		Link temp = first;
		if(first.next!=null){
			last = null;
		}
		first.next = first;
		return temp;
	}
	public void display(){
		System.out.println("list :(first ---> last)");
		Link current = first;
		while (current != null) {
			current.displayLink();
			current = current.next;
		}
	}
	public static void main(String[] args) {
		FirstLastList fll = new FirstLastList();
		fll.insertFirst(1);
		//fll.insertFirst(2);
		fll.insertFirst(3);
		
		fll.insertLast(55);
		fll.insertLast(77);
		Link k = new Link(2);
		fll.insert(k);
		//fll.deleteLink();   //删除不掉最后一个
		fll.display();
		//fll.deleteLink();
		
	}
}

链表的增删查改

package com.test;

/*
 * 1、链表的插入、删除
 * 2、查找链表中指定的连接点
 * 3、删除链表中指定的连接点
 * 
 * */

public class LinkList {
	private Link  firstLink;   //链表中第一个数
	public LinkList(){
		firstLink = null;
	}
	public boolean isEmpty(){
		return (firstLink==null);
	} 
	public void insertFirst(int id){
		Link newLink = new Link(id);
		newLink.next = firstLink;	// 让新创建的连接点的next指向原来(第一个)的连接点
		firstLink = newLink;		// 改变原来firstLink的值,让他指向新的连接点	
	}
	public Link deleteFirst(){
		Link  temp = firstLink;    //在删除之前将链表中第一个存在temp中,然后删除firstLink(假设有删除操作)
		firstLink = firstLink.next;//将firstLink指向原来firstLink的下一个(next)
		return temp;			   //返回删除后的这个数
	}
	public void displayList(){
		Link current = firstLink;
		while (current != null) {
			current.displayLink();
			current = current.next;					
		}
	}
	/*
	 * currentLink 的变量开始指向第一个连接点(即,firstLink)
	 * 然后通过不断的把自身的值赋值给 currentLink.next,沿着链表向前移动
	 * 检查每个连接点的key 是否与 参数(id)相等
	 * 若找到匹配的,则返回此连接点的引用,否则返回 null
	 * */
	public Link find(int id){
		Link currentLink = firstLink;		//保存第一个连接点(即 currentLink 引用第一个练级点)
		while (currentLink.iData!= id) {	//若连接点的key 与参数是否相等
			if(currentLink.next == null){	//若连接点的的下一个为空
				return null;
			}else{
				currentLink = currentLink.next;	//否则让此连接点等于下一个连接点,继续循环			
			}		
		}
		return currentLink;
	}
	public Link deleteLink(int id){
		Link beforLink = firstLink;   //被删除数的前一个数
		Link tempLink = firstLink;	  //被删除的数
		while (tempLink.iData!=id) {
			if(tempLink == null){
				return null;
			}else{
				beforLink = tempLink;			//beforLink 始终等于 被删除数(tempLink) 的前一个数
				tempLink = tempLink.next;				
			}
		}
		if(tempLink == firstLink){			//若 被删除数(tempLink) 为 链表中的第一个数,则让firstLink 等于他的下一个
			firstLink = firstLink.next;
		}else{
			beforLink.next = tempLink.next;  //否则 让被删除数(tempLink) 的后一个数等于 被删除数的位置 (即beforLink.next) 
		}
		return tempLink;
	}
	public static void main(String[] args) {
		LinkList theLinkList = new LinkList();
		theLinkList.insertFirst(1);
		theLinkList.insertFirst(2);
		theLinkList.insertFirst(3);
		theLinkList.displayList();
		//循环删除 链表里面的值
		while (!theLinkList.isEmpty()) {
			Link aLink = theLinkList.deleteFirst();
			System.out.println("Delete");
			aLink.displayLink();			
		}		
		theLinkList.displayList();
		//找到指定的连接点
		Link  find = theLinkList.find(2);
		if(find!=null){
			System.out.println("find link with key--->"+find.iData);
		}else{
			System.out.println("can't find "+find.iData);
		}
		//删除指定的连接点
		Link delet = theLinkList.deleteLink(2);
		if(delet!=null){
			System.out.println("delete link with key--->"+find.iData);
		}else{
			System.out.println("can't find "+find.iData);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值