JAVA的链表学习【2019.2.21】

哈喽,这回我又开始学习Java的链表了,内心是大写的苦逼,真的摄入知识点真的有点杂,但还是要坚持记笔记呀。
还是简单说一下链表是个嘛呀?
它就是个数据结构,和数组是同级的
不太好理解对吧,这样我们再来图表示一下在这里插入图片描述
实际上呢,链表也是一样的。

操作链表

*链表的操作方法与数组不同,我们是不能利用常量的时间内访问单链表的随机元素
如果我们想要获得某个元素的时候,我们需要做的是从头节点逐个遍历

public class Mylink {
	Cur head = null; // 使用給定值初始化新節點cur

	/**
	 * name:Mylink
	 *  功能: 链表中的节点,data代表节点的值,next是指向下一个节点的引用
	 * ------------------------------------------------ --------
	 * 作者:lxw: 修改时间:2019年9月21日
	 * 
	 *
	 */
	class Cur {
		Cur next = null;// 將cur的next的字段链接到下一个结点
		int val;//定义一个值,作为节点内容

		public Cur(int data) {
			this.val = data;
		}
	}

添加

1.使用给定值初始化新节点个人认为null是个很厉害的东西我们可以使用null直接赋值
2.我们要将新的节点next字段链接到下一个节点的next
3.还要将上一个节点的next链接到新的节点
与数组不同,我们不需要把所有元素移动到插入元素之后,因此,你可以高效的将元素插入链表。

删除

删除链表也是个技术活
1.找到新节点的上一个节点还有下一个节点的next
2.接下来删了新节点再把上一个节点和下一个节点连起来
如果理解不了,那就看图吧在这里插入图片描述
继续上代码:

/**
	 * NAME:deleteNode 
	 * 功能:删除第index个节点 
	 * 参数:index 
	 * --------------------------------
	 */
	public boolean deleteNode(int index) {
		if (index < 1 || index > length()) {
			return false;
		}
		if (index == 1) {
			head = head.next;
			return true;
		}
		int i = 1;
		Cur preNode = head;
		Cur curNode = preNode.next;
		while (curNode != null) {
			if (i == index) {
				preNode.next = curNode.next;
				return true;
			}
			preNode = curNode;
			curNode = curNode.next;
			i++;
		}
		return false;
	}

不知道有没有人跟我一样写Boolean,习惯写成bool的【擦汗】
我总有一个冲动,就是不给数据赋值,我喜欢让大家自己赋值,这里就得使用Java的一个头文件

import java.util.Scanner;

今天的学习成果还是看程序吧:
【这个是自己给链表赋值,在它下面的程序是用数组元素来赋值的】

import java.util.Scanner;

public class Mylink {
	Cur head = null; // 使用給定值初始化新節點cur

	/**
	 * name:Mylink
	 *  功能: 链表中的节点,data代表节点的值,next是指向下一个节点的引用
	 * ------------------------------------------------ --------
	 * 作者:lxw: 修改时间:2019年9月21日
	 * 
	 *
	 */
	class Cur {
		Cur next = null;// 將cur的next的字段链接到下一个结点
		int val;//定义一个值,作为节点内容

		public Cur(int data) {
			this.val = data;
		}
	}

	/**
	 * 功能:向链表中插入数据
	 *
	 * 参数:d
	 */
	public void addNode(int d) {
		Cur newCur = new Cur(d);// 实例化一个节点
		if (head == null) {
			head = newCur;
			return;
		}
		Cur temp = head;
		while (temp.next != null) {
			temp = temp.next;
		}
		temp.next = newCur;
	}

	/**
	 * NAME:deleteNode 
	 * 功能:删除第index个节点 
	 * 参数:index 
	 * --------------------------------
	 */
	public boolean deleteNode(int index) {
		if (index < 1 || index > length()) {
			return false;
		}
		if (index == 1) {
			head = head.next;
			return true;
		}
		int i = 1;
		Cur preNode = head;
		Cur curNode = preNode.next;
		while (curNode != null) {
			if (i == index) {
				preNode.next = curNode.next;
				return true;
			}
			preNode = curNode;
			curNode = curNode.next;
			i++;
		}
		return false;
	}

	/**
	 * NAME:deleteNode11
	 *  功能:在不知道头指针的情况下删除指定节点
	 *   参数:n ----------------------
	 */
	public boolean deleteNode11(Cur n) {
		if (n == null || n.next == null) {
			return false;
		}
		int temp = n.val;
		n.val = n.next.val;
		n.next.val = temp;
		n.next = n.next.next;
		System.out.println("删除成功!");
		return true;
	}

	/**
	 * NAME:length 功能:返回节点长度
	 */
	public int length() {
		int length = 0;
		Cur tmp = head;
		while (tmp != null) {
			length++;
			tmp = tmp.next;
		}
		return length;
	}

	public void printList() {
		Cur tmp = head;
		while (tmp != null) {
			System.out.println(tmp.val);
			tmp = tmp.next;
		}
	}

	public static void main(String[] args) {
		Mylink list = new Mylink();
		 	list.addNode(3);
		    list.addNode(1); 
		    list.addNode(2);
		    list.addNode(84);
		 	list.addNode(45);
		System.out.println("linkLength:" + list.length());
		System.out.println("head.data:" + list.head.val);
		list.printList();
		list.deleteNode(4);
		System.out.println("After deleteNode(4):");
		list.printList();
	}
}

下面是用数组赋值的

import java.util.Scanner;

public class Mylink {
	Cur head = null; // 使用給定值初始化新節點cur

	/**
	 * name:Mylink
	 *  功能: 链表中的节点,data代表节点的值,next是指向下一个节点的引用
	 * ------------------------------------------------ --------
	 * 作者:lxw: 修改时间:2019年9月21日
	 * 
	 *
	 */
	class Cur {
		Cur next = null;// 將cur的next的字段链接到下一个结点
		int val;//定义一个值,作为节点内容

		public Cur(int data) {
			this.val = data;
		}
	}

	/**
	 * 功能:向链表中插入数据
	 *
	 * 参数:d
	 */
	public void addNode(int d) {
		Cur newCur = new Cur(d);// 实例化一个节点
		if (head == null) {
			head = newCur;
			return;
		}
		Cur temp = head;
		while (temp.next != null) {
			temp = temp.next;
		}
		temp.next = newCur;
	}

	/**
	 * NAME:deleteNode 
	 * 功能:删除第index个节点 
	 * 参数:index 
	 * --------------------------------
	 */
	public boolean deleteNode(int index) {
		if (index < 1 || index > length()) {
			return false;
		}
		if (index == 1) {
			head = head.next;
			return true;
		}
		int i = 1;
		Cur preNode = head;
		Cur curNode = preNode.next;
		while (curNode != null) {
			if (i == index) {
				preNode.next = curNode.next;
				return true;
			}
			preNode = curNode;
			curNode = curNode.next;
			i++;
		}
		return false;
	}

	/**
	 * NAME:deleteNode11
	 *  功能:在不知道头指针的情况下删除指定节点
	 *   参数:n ----------------------
	 */
	public boolean deleteNode11(Cur n) {
		if (n == null || n.next == null) {
			return false;
		}
		int temp = n.val;
		n.val = n.next.val;
		n.next.val = temp;
		n.next = n.next.next;
		System.out.println("删除成功!");
		return true;
	}

	/**
	 * NAME:length 功能:返回节点长度
	 */
	public int length() {
		int length = 0;
		Cur tmp = head;
		while (tmp != null) {
			length++;
			tmp = tmp.next;
		}
		return length;
	}

	public void printList() {
		Cur tmp = head;
		while (tmp != null) {
			System.out.println(tmp.val);
			tmp = tmp.next;
		}
	}

	public static void main(String[] args) {
		Mylink list = new Mylink();
		System.out.println("Tell me 10 figures:" );
		int arr[] = new int[10];
		Scanner cur = new Scanner(System.in);
		for (int i = 0; i < arr.length; i++) {
			arr[i] = cur.nextInt();
			list.addNode(arr[i]);
		}
		System.out.println("linkLength:" + list.length());
		System.out.println("head.data:" + list.head.val);
		list.printList();
		list.deleteNode(4);
		System.out.println("After deleteNode(4):");
		list.printList();
	}
}

好了,今日学习就是java链表了,明儿还得看看c语言的链表。
我觉得,目前这是我理解到的所有链表知识,我还会继续学习链表,也会继续更新链表,争取早点可以了解完整整个链表吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值