Java实现带有头结点的单链表的增删改查!

Java实现带有头结点的单链表的增删改查!

在这里就不解释了,代码里有注释很容易看懂的!

package List;
/**
 * @author ganxiang
 * @IDE IntelliJ IDEA
 * @project_name JavaDemo
 * @filename SingalList
 * @date 2020/02/24
 */

public class SignalList {
	class  DefineNode{//创建带头结点的链表,head->data1->data2->data3
		int data;
		DefineNode next;
		public DefineNode(int d){
			this.data=d;
		}
	}
	DefineNode head;
	public  void insret_one(int dex){//插入一个节点
		if(head==null){
			head =new DefineNode(dex);
			System.out.println(head.data);
		}

	}
	DefineNode temp ;
	public DefineNode insert_many(){//插入多个节点,这里插入6个
		for (int i=10;i<=15;i++){
			if (temp==null) {
				temp = new DefineNode(i);
			}
			else {
				DefineNode node =temp;
				while (node.next!=null){
					node=node.next;//找到尾结点 将值赋给尾结点
				}
				node.next=new DefineNode(i);
			}
		}
		return temp;
	}

	public int getSize(DefineNode t) {//计算链表的长度
		int size=0;
		while(t!=null){
			size++;
			t=t.next;
		}
		return size;
	}
	public int printList(DefineNode t){//打印链表
		while (t!=null){
			System.out.println(t.data);
			t=t.next;
		}
		return 0;
	}
	public DefineNode addFirst(int data,DefineNode t){//插入链表中的第一个节点(头结点)
		DefineNode node = new DefineNode(data);
		if (t ==null){
			t=node;
		}
		else{
			node.next =t;
			t =node;
//			printList(t);

		}
		return t;

	}
	public  void addLast(int data){//插入链表中的最后一个节点(尾节点)
		DefineNode node =new DefineNode(data);
		DefineNode t=temp;
		if (t ==null){
			t=node;
		}
		else{
			while (t.next!=null){
//				System.out.println(t.data);
				t =t.next;
			}
			t.next =node;
		}
	}

	public  DefineNode inset_index(DefineNode t, int k,int data){//指定索引插入节点
		int size =getSize(t);
		if (k<1||k>size)System.out.println("无法插入数据!");
		else{
			if (k==1)return addFirst(data,t);
			else {
//				if(t==null){
//					t =new DefineNode(data);
//				}
				if (k ==size){
					addLast(data);
				}
				else {
					int count =1;
					DefineNode tt=t;//保证头结点不变
					while(tt!=null&&count<k-1){
						count++;
						tt=tt.next;
					}
					DefineNode a ;//将a节点等于插入索引位置前一个节点
					a = new DefineNode(data);//给a节点插入数据
					a.next = tt.next;
					tt.next = a;
//					printList(a);

				}
			}
		}

		return t;
	}
	public DefineNode delFirst(DefineNode t){//删除头结点
		DefineNode a;
		if (t==null)System.out.println("无法操作链表,链表为空!");
		else{
			a = t.next;
			t=a;
		}
		return t;

	}
	public DefineNode delLast(DefineNode t){//删除尾节点
		DefineNode a =t;
		if (t==null)System.out.println("无法操作链表,链表为空!");
		else{
			while (a.next.next!=null){
				a = a.next;
			}
			a.next =null;
		}
		return t;
	}
	public DefineNode del_index(int k,DefineNode t){//根据索引删除节点
		DefineNode a=t;
		int count =1;
		if (k<1||k>getSize(a))System.out.println("不符合链表的操作范围!");
		else {
			if (k==1)return delFirst(a);
			else if (k==getSize(a))return delLast(a);
			else {
				while (a != null && count <k - 1) {
					a = a.next;
					count++;
//					System.out.println(count);
				}
				DefineNode s = a;
				s.next = s.next.next;
				a=s;
//				printList(a);

			}
		}
		return t;
	}
	public DefineNode upsataFirst(int data,DefineNode t){//修改第一个节点
		DefineNode a =t;
		if (a==null){
			a = new DefineNode(data);
			t=a;
		}
		else {
			a =new DefineNode(data);
			a.next=t.next;
			t=a;
		}
		return t;
	}
	public DefineNode updataLast(int data,DefineNode t){//修改最后一个节点
		DefineNode a=t;
		if (a==null)System.out.println("空链表无法操作!");
		else {
			while(a.next.next!=null){
				a=a.next;
			}
//			printList(a);
			DefineNode s =new DefineNode(data);
			a.next =s;
		}
		return t;
	}
	public DefineNode updata_index(int data,DefineNode t,int k){//根据索引来修改节点
		DefineNode a =t;
		if (k<1||k>getSize(a))System.out.println("不在操作范围!");
		else
		{
			if (k==1)return upsataFirst(data,a);
			else if (k==getSize(a))return updataLast(data,a);
			else {
				int count =1;
				DefineNode s =new DefineNode(data);
				while (a.next!=null&&count<k-1){
					count++;
					a=a.next;
				}
//				printList(a);
				s.next=a.next.next;
//				printList(s);
				a.next=s;
//				printList(a);
			}
		}
		return t;
	}
	public static void main(String[] args) {
		SignalList signal =new SignalList();
//		signal.insret_one(6);
		signal.insert_many();//增加节点
		int size = signal.getSize(signal.temp);
		System.out.println("insert_many()中链表temp的长度为:"+size);
		System.out.println("没指定索引修改时链表为:");
		signal.printList(signal.temp);

		//增加 add or insert
//		DefineNode inset_index =signal.inset_index(signal.temp,3,20);
//		System.out.println("指定索引插入后链表为:");
//		signal.printList(inset_index);
//		System.out.println("指定索引插入后链表长度为:"+signal.getSize(inset_index));


//		//删除delete
//		DefineNode delFirst = signal.delFirst(signal.temp);//测试删除头结点
//		System.out.println("删除头结点的链表为:");
//		signal.printList(delFirst);
//		DefineNode delLast =signal.delLast(signal.temp);//测试删除尾节点
//		System.out.println("删除为结点的链表为:");
//		signal.printList(delLast);
//		DefineNode del_index = signal.del_index(3,signal.temp);//指定位置删除节点
//		System.out.println("删除指定结点的链表为:");
//		signal.printList(del_index);

		//修改update
//		DefineNode updataFirst=signal.upsataFirst(100,signal.temp);
//		System.out.println("修改好头结点的链表为:");
//		signal.printList(updataFirst);
//		DefineNode updataLast =signal.updataLast(120,signal.temp);
//		System.out.println("修改好尾结点的链表为:");
//		signal.printList(updataLast);
		DefineNode updata_index =signal.updata_index(200,signal.temp,5);
		System.out.println("修改好指定结点的链表为:");
		signal.printList(updata_index);




	}


}

运行展示
指定修改第5个节点的值为200.
Java实现带有头结点的单链表的增删改查!_第1张图片
这里只展示了一个运行的结果,你们可以多调试看看,我运行都没错误的,若有错误之处恳请各位大佬多多指点。

你可能感兴趣的:(Java)