链表

链表

单链表

双向链表

链表的基本操作


查找节点

时间复杂度O(n)

	/**
	 * 查找链表元素
	 * @param index
	 * @return
	 */
	public Node get(int index){
		if(index<0 || index >=size){
			System.out.println("超出了链表的查找范围!");
			return null;
		}
		Node temp = head;  // 创建临时节点
		for(int i=0;i<index;i++){
			temp = temp.next;
		}
		return temp;
	}
	

更新节点

	/**
	 * 更新链表的元素
	 * @param index
	 * @param data
	 */
	public void update(int index,int data){
		if(index<0 || index>= size){
			System.out.println("超出链表的范围!");
			return;
		}
		Node node = get(index);
		node.data = data;
	}

插入节点

/**
	 * 插入节点
	 * @param index
	 * @param data
	 */
	public void insert(int index,int data){
		
		if(index<0 || index>size){
			System.out.println("插入链表的插入范围!");
			return;
		}
		//创建一个节点
		Node insertedNode = new Node(data);
		
		if(size==0){
			//空链表
			head = insertedNode;
			last = insertedNode;
		}else if(index==0){
			// 从头部插入
			insertedNode.next = head;
			head = insertedNode;
		}else if(index == size){
			//从尾部插入
			last.next = insertedNode;
			last = insertedNode;
		}else{
			//中间插入
			Node prevNode = get(index-1); //获取插入节点的上一个节点
			insertedNode.next = prevNode.next;  
			prevNode.next = insertedNode;
		}
		size++;
	}

删除节点

/**
	 * 删除链表中的节点
	 * @param index
	 */
	public void remove(int index){
		if(index<0 || index >=size){
			System.out.println("超出了链表的范围!");
			return ;
		}
		if(index == 0){
			//头部删除
			Node node = get(index);
			head = node.next;
		}else if(index == size-1){
			//尾部删除
			Node provNode = get(index-1);
			provNode.next = null;
			last = provNode;
		}else{
			//中间删除
			Node provNode = get(index-1);
			provNode.next = provNode.next.next;
		}
		size--;
	}

完整的代码:

package 链表;

public class MyLinklist {

	private Node head;  // 头节点指针
	private Node last;  // 尾节点指针
	private int size;   // 链表的长度
	
	/**
	 * 链表节点
	 * @author hecha
	 *
	 */
	public static class Node{
		int data;
		Node next;
		Node(int data){
			this.data = data;
		}
	}
	/**
	 * 插入节点
	 * @param index
	 * @param data
	 */
	public void insert(int index,int data){
		
		if(index<0 || index>size){
			System.out.println("插入链表的插入范围!");
			return;
		}
		//创建一个节点
		Node insertedNode = new Node(data);
		
		if(size==0){
			//空链表
			head = insertedNode;
			last = insertedNode;
		}else if(index==0){
			// 从头部插入
			insertedNode.next = head;
			head = insertedNode;
		}else if(index == size){
			//从尾部插入
			last.next = insertedNode;
			last = insertedNode;
		}else{
			//中间插入
			Node prevNode = get(index-1); //获取插入节点的上一个节点
			insertedNode.next = prevNode.next;  
			prevNode.next = insertedNode;
		}
		size++;
	}
	/**
	 * 更新链表的元素
	 * @param index
	 * @param data
	 */
	public void update(int index,int data){
		if(index<0 || index>= size){
			System.out.println("超出链表的范围!");
			return;
		}
		Node node = get(index);
		node.data = data;
	}
	/**
	 * 删除链表中的节点
	 * @param index
	 */
	public void remove(int index){
		if(index<0 || index >=size){
			System.out.println("超出了链表的范围!");
			return ;
		}
		if(index == 0){
			//头部删除
			Node node = get(index);
			head = node.next;
		}else if(index == size-1){
			//尾部删除
			Node provNode = get(index-1);
			provNode.next = null;
			last = provNode;
		}else{
			//中间删除
			Node provNode = get(index-1);
			provNode.next = provNode.next.next;
		}
		size--;
	}
	/**
	 * 查找链表元素
	 * @param index
	 * @return
	 */
	public Node get(int index){
		if(index<0 || index >=size){
			System.out.println("超出了链表的查找范围!");
			return null;
		}
		Node temp = head;  // 创建临时节点
		for(int i=0;i<index;i++){
			temp = temp.next;
		}
		return temp;
	}
	
	/**
	 * 查看链表所有元素
	 * @param args
	 */
	public void output(){
		Node temp = head;
		for(int i=0;i<size;i++){
			System.out.println(temp.data);
			temp = temp.next;
		}
	}
	
	public static void main(String[] args) {
		MyLinklist ll = new MyLinklist();
		ll.insert(0, 20);
		ll.insert(1,3);
		ll.insert(2,99);
		ll.output();  // 输出所有元素
		System.out.println("----------");
		ll.insert(1, 55);
		ll.update(0, 21);
		ll.output();  // 输出所有元素
		System.out.println("----------");
		ll.remove(0);
		ll.remove(1);
		ll.remove(1);
		ll.output();  // 输出所有元素

	}
}

数组VS链表

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值