java实现的单链表增删操作

链表不按照线性的顺序存储数据,而是由若干同一个结构类型的“结点”依次串接而成的,结点由数据部分和下一个结点的地址部分组成。当结点只包含其后继结点的信息的链表称做单链表,如下图所示,head存放链表首结点的地址,rear指向链表表尾。

在这里插入图片描述

class Node<T> {
    public Node<T> next = null;
    public T data;
    public Node(T data) {
 	   this.data = data;
    }
}
public class MyLinkedList<T> {

	public Node<T> head = null;   //链表头的引用 ,类似于头指针  
	public Node<T> rear = null;   //指向最后一个结点
	 
	/**********依次向链表中插入数据;建表*********/
	public void addNode (T d) {
		
		Node<T> newNode = new Node<>(d);
		if(head == null) {
			head = newNode;
			rear = head;
			return;
		}
		//尾插法
        rear.next = newNode;
        rear=newNode;          //新结点在后面,即变成尾部结点
	}
	
	 /*********删除第index个结点***********/
	public Boolean deleteNode(int index) {
		
		// 删除链表第一个元素
		if(index == 1) {
			head = head.next;    //头指针指向第二个node
			return true;
		}
		int i=2;
		Node<T> preNode = head;      // 指向 第一个节点
		Node<T> curNode = preNode.next;   // curNode代表要删除的结点
		
		while(curNode!=null) {
			if(i==index) {
				preNode.next=curNode.next;   
				return true;
			}
			preNode = curNode;
			curNode = curNode.next;
			i++;
		}
		return false;      
	}
	/*********在第index位置插入新结点***********/
	public boolean insertNode(int index,T n) {
		
		Node<T> p = new Node<>(n);
		// 插入到链表第一个元素
		if(index == 1) {
			p.next = head;    
			head = p;       // head 指向首结点
			return true;
		}
		
		int i=2;
		Node<T> curNode = head;   // 代表要插入位置的前一个结点
		while(curNode!=null) {
			if(i==index) {
				p.next = curNode.next;   // 先让新结点指向链表的curNode下一个结点
				curNode.next = p;
				return true;
			}
			curNode = curNode.next;
			i++;
		}
     	return false;      
	}
	/**********返回链表的长度***********/
    public int length() {
    	int length=0;
    	Node<T> tmp=head;         
    	while( tmp!=null ) {
    		length ++;
    		tmp=tmp.next;
    	}
    	return length;
    }
    
	/***********输出链表***********/
	public void printList() {
		Node<T> tmp =head;
		while(tmp!=null) {
			System.out.print(tmp.data+" ");
			tmp=tmp.next;
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		MyLinkedList<Integer> list = new MyLinkedList<>();
		// 建表
		list.addNode(2);
		list.addNode(5);
		list.addNode(6);
		list.addNode(3);
		list.addNode(5);
		list.addNode(4);
		System.out.println("listLen="+list.length());
		list.printList();
		// 插入测试
		boolean flag1=list.insertNode(1,9);
		System.out.println(flag1);
		System.out.println("listLen="+list.length());
		list.printList();
		// 删除测试
		boolean flag2 = list.deleteNode(7);
		System.out.println(flag2);
		list.printList();
		System.out.println("listLen="+list.length());
	}
}
输出
listLen=6
2 5 6 3 5 4 
true
listLen=7
9 2 5 6 3 5 4 
true
9 2 5 6 3 5 
listLen=6
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值