单端链表、双端链表、双向链表的代码实现

1.单端链表

单端链表是链表中最简单的一种格式,用户的操作(添加、删除、遍历)只能从链表头开始,具体代码实现如下

public class SingleLinkDemo {

	private Node first;// 首节点
	
	//在首节点插入
	public void insertFirst(String data){
		Node node = new Node(data);
		node.next = first;
		first = node;
	}
	
	//删除首节点元素
	public Node deleteFirst(){
		Node res = first;
		if(null != first){
			res = first;
			first = first.next;
		}
		return res;
	}

	//查找指定data的node
	public Node find(String data){
	
		Node demoFirst = first;
		while(null != demoFirst){
			if(demoFirst.data.equals(data)){
				return demoFirst;
			}else{
				demoFirst = demoFirst.next;
			}
		}
		return null;
	}
	
	//删除指定data的node
	public Node delete(String data){
		Node current = first;
		Node previous = first;
		while(null != current){
			if(current.data.equals(data)){
				previous.next = current.next;
				break;
			}else{
				previous = current;
				current = current.next;
			}
		}
		return current;
	}
	
	//展示所有节点内容
	public void displayList(){
		if(null != first){
			StringBuffer sb = new StringBuffer();
			Node demoFirst = first;
			while(demoFirst != null){
				sb.append(demoFirst.data).append(" ");
				demoFirst = demoFirst.next;
			}
			System.out.println(sb.toString());
		}
	}
	
	public boolean isEmpty(){
		return first == null;
	}
	
	/**
	 *	节点类 
	 */
	private class Node{
		String data;
		Node next;
		
		public Node(String data) {
			super();
			this.data = data;
		}
		
		@Override
		public String toString() {
			return data;
		}
	}
}


2.双端链表

双端链表相对于单端链表多了一个特性:对最后一个链接点的引用,代码实现如下

public class DoubleLinkDemo {

	private Node first;//首节点
	private Node last;//尾节点
	
	//在链表头插入数据
	public void insertFirst(String data){
		Node node = new Node(data);
		if(isEmpty()){
			last = node;//说明该节点是首个节点,则其既是首节点也是尾节点
		}else{
			node.next = first;
		}
		first = node;
	}

	//在链表尾插入数据
	public void insertLast(String data){
		Node node = new Node(data);
		if(isEmpty()){
			first = node;
		}else{
			last.next = node;
		}
		last = node;
	}
	
	//删除链表头数据
	public Node deleteFirst(){
		Node res = first;
		if(!isEmpty()){
			first = first.next;
		}
		return res;
	}
	
	//展示所有节点内容
	public void displayList(){
		if(null != first){
			StringBuffer sb = new StringBuffer();
			Node demoFirst = first;
			while(demoFirst != null){
				sb.append(demoFirst.data).append(" ");
				demoFirst = demoFirst.next;
			}
			System.out.println(sb.toString());
		}
	}
	
	public boolean isEmpty(){
		return first == null;
	}
	
	/**
	 *	节点类 
	 */
	private class Node{
		String data;
		Node next;
		
		public Node(String data) {
			super();
			this.data = data;
		}
		
		@Override
		public String toString() {
			return data;
		}
	}
}


3.双向链表

双向链表是使用比较多的一种结构,相对于单端链表只能从链表头开始正向遍历,双向链表可以逆向遍历,每个节点需要保存前一个节点和后一个节点的引用,代码实现如下

public class DoubleDirectionLinkDemo {

	private Node first;//首节点
	private Node last;//尾节点
	
	//在链表头插入数据
	public void insertFirst(String data){
		Node node = new Node(data);
		if(isEmpty()){
			last = node;
		}else{
			first.privious = node;
			node.next = first;
		}
		first = node;
	}
	
	//在链表尾插入数据
	public void insertLast(String data){
		Node node = new Node(data);
		if(isEmpty()){
			first = node;
		}else{
			last.next = node;
			node.privious = last;
		}
		last = node;
	}
	
	//删除链表头数据
	public Node deleteFirst(){
		Node res = first;
		if(!isEmpty()){
			if(res.next == null){//只有一个元素
				last = null;
			}else{
				first.next.privious = null;
			}
			first = first.next;
		}
		return res;
	}
	
	//删除链表尾数据
	public Node deleteLast(){
		Node res = last;
		if(!isEmpty()){
			if(res.privious == null){//只有一个元素
				first = null;
			}else{
				last.privious.next = null;
			}
			last = last.privious;
		}
		return res;
	}
	
	//删除指定节点
	public Node delete(String data){
		Node current = first;
		if(!isEmpty()){
			while(!current.data.equals(data)){
				current = current.next;
				if(null == current){
					return current;
				}
			}
			
			if(current == first){
				first = current.next;
			}else{
				current.privious.next = current.next;
			}
			
			if(current == last){
				last = current.privious;
			}else{
				current.next.privious = current.privious;
			}
		}
		return current;
	}
	
	public boolean isEmpty(){
		return first == null;
	}
	
	//展示所有节点内容
	public void displayList(){
		if(null != first){
			StringBuffer sb = new StringBuffer();
			Node demoFirst = first;
			while(demoFirst != null){
				sb.append(demoFirst.data).append(" ");
				demoFirst = demoFirst.next;
			}
			System.out.println(sb.toString());
		}
	}
	
	//节点类
	private class Node{
		String data;
		Node next;//后节点
		Node privious;//前节点
		public Node(String data) {
			super();
			this.data = data;
		}
		
		@Override
		public String toString() {
			return data;
		}
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

恐龙弟旺仔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值