Java数据结构-单向链表与双向链表

韩顺平2019-Java数据结构

学习韩顺平老师的Java数据结构

构建单向链表与双向列表

代码里包括一下内容
单向链表
1.增(链表最后节点增,和根据id排序增),删,改,查
2.获取倒数地index的节点
3.获取列表长度
4.列表逆序以及列表逆序输出(不改变链表的原有节点)
5.合并两个有序单链表(用到递归)—课后作业
双向链表
增(链表最后节点增,和根据id排序增),删,改,查
1.定义节点

package com.second.week;

/**
 * 〈一句话功能简述〉<br>
 * 〈英雄〉
 *
 * @author PitterWang
 * @create 2019/11/30
 * @since 1.0.0
 */
public class HeroNode {

	int no;
	String name;
	String nikeName;
	HeroNode nextHeroNode;
	HeroNode preHeroNode;

	public HeroNode(int no, String name, String nikeName) {
		this.no = no;
		this.name = name;
		this.nikeName = nikeName;
	}

	@Override
	public String toString() {
		return "HeroNode{" +
				"no=" + no +
				", name='" + name + '\'' +
				", nikeName='" + nikeName + '\'' +
				'}';
	}

	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getNikeName() {
		return nikeName;
	}

	public void setNikeName(String nikeName) {
		this.nikeName = nikeName;
	}

	public HeroNode getNextHeroNode() {
		return nextHeroNode;
	}

	public void setNextHeroNode(HeroNode nextHeroNode) {
		this.nextHeroNode = nextHeroNode;
	}

	public HeroNode getPreHeroNode() {
		return preHeroNode;
	}

	public void setPreHeroNode(HeroNode preHeroNode) {
		this.preHeroNode = preHeroNode;
	}
}

2.构建单向链表


	
package com.second.week;

import java.util.Stack;

/**
 * 〈单向链表〉<br>
 * 〈〉
 *
 * @author PitterWang
 * @create 2019/11/30
 * @since 1.0.0
 */
public class SingleLinkedList {


	//初始化头节点
	private HeroNode head = new HeroNode(0, "", "");


	public HeroNode getHeroNode(){
		return this.head;
	}
	//添加(在最后节点添加)
	public void add(HeroNode newHeroNode){

		HeroNode temp = head;

		while (true){
			if(temp.nextHeroNode == null){
				break;
			}

			temp = temp.nextHeroNode;
		}

		temp.nextHeroNode = newHeroNode;

	}


	public void addOrderBy(HeroNode newHeroNode){
		HeroNode temp = head;

		boolean isAdd = true;
		while (true){
			if(temp.nextHeroNode == null){
				break;
			}

			if (temp.nextHeroNode.no > newHeroNode.no){
				break;
			}else if(temp.nextHeroNode.no == newHeroNode.no){
				isAdd = false;
				break;
			}

			temp = temp.nextHeroNode;
		}

		if(isAdd){

			newHeroNode.nextHeroNode = temp.nextHeroNode;
			temp.nextHeroNode = newHeroNode;
		}else{
			System.out.println("已存在不能添加");
		}

	}


	public void update(HeroNode newHeroNode){
		HeroNode temp = head;

		if(temp.nextHeroNode == null){
			System.out.println("空链表");
		}

		boolean isUpdate = false;
		while (true){
			if(temp == null){
				break;
			}

			if (temp.no == newHeroNode.no){
				isUpdate = true;
				break;
			}

			temp = temp.nextHeroNode;
		}

		if(isUpdate){
			temp.name = newHeroNode.name;
			temp.nikeName = newHeroNode.nikeName;


		}else{
			System.out.println("不存在");
		}
	}


	public void delete(int no){
		HeroNode temp = head;

		if(temp.nextHeroNode == null){
			System.out.println("空链表");
		}

		boolean isDelete = false;
		while (true){
			if(temp.nextHeroNode == null){
				break;
			}

			if (temp.nextHeroNode.no == no){
				isDelete = true;
				break;
			}

			temp = temp.nextHeroNode;
		}

		if(isDelete){

			temp.nextHeroNode = temp.nextHeroNode.nextHeroNode;


		}else{
			System.out.println("不存在");
		}
	}
	public void list(){
		if(head.nextHeroNode == null){
			System.out.println("空");
			return;
		}
		HeroNode temp = head.nextHeroNode;
		while (true){
			if(temp == null){
				break;
			}
			System.out.println(temp);

			temp = temp.nextHeroNode;
		}
	}

	/**
	 * 获取列表长度
	 * @return
	 */
	public int size(){
		if(head.nextHeroNode == null){
			System.out.println("空");
			return 0;
		}
		HeroNode temp = head.nextHeroNode;
		int lenth = 0;
		while (true){
			if(temp == null){
				break;
			}
			temp = temp.nextHeroNode;
			lenth ++ ;
		}
		return lenth;
	}

	/**
	 * 获取倒数地index的节点
	 * @param index
	 * @return
	 */
	public HeroNode findLastIndexNode(int index){


		if(head.nextHeroNode == null){
			return null;
		}

		int size = this.size();

		if(index <= 0 || index > size){
			return null;
		}

		HeroNode temp = head.nextHeroNode;

		for (int i = 0 ; i < size - index ; i ++){
			temp = temp.nextHeroNode;
		}

		return temp;
	}


	/***
	 * 列表逆序
	 * @return
	 */
	public HeroNode revererNode(){
		HeroNode revererNode = new HeroNode(0, "", "");

		if(head.nextHeroNode == null || head.nextHeroNode.nextHeroNode == null){
			return head;
		}


		HeroNode temp = head.nextHeroNode;

		HeroNode next = null; //指向cur的下一个节点

		while (temp != null){


			next = temp.nextHeroNode;

			temp.nextHeroNode = revererNode.nextHeroNode;

			revererNode.nextHeroNode = temp;

			temp = next;
		}

		head.nextHeroNode = revererNode.nextHeroNode;



		return head;

	}


	public void reversePrint(){
		if(head.nextHeroNode == null){
			return;
		}

		Stack<HeroNode> stack = new Stack<HeroNode>();

		HeroNode temp = head.nextHeroNode;


		while (temp != null){
			stack.add(temp);
			temp = temp.nextHeroNode;
		}

		while (stack.size() > 0){
			System.out.println(stack.pop());
		}
	}

	/***
	 * 合并两个有序单链表(用到递归)
	 * @param a
	 * @param b
	 * @return
	 */
	public  HeroNode mergeList(HeroNode a,HeroNode b) {
		HeroNode result = null;
		if (a == null) {
			return b;
		}
		if (b == null) {
			return a;
		}
		if (a.getNo() <= b.getNo()) {
			result = a;
			result.setNextHeroNode(mergeList(a.getNextHeroNode(), b));
		} else {
			result = b;
			result.setNextHeroNode(mergeList(a, b.getNextHeroNode()));
		}
		return result;
	}
}

3.构建双向链表

package com.second.week;

/**
 * 〈一句话功能简述〉<br>
 * 〈双向列表〉
 *
 * @author PitterWang
 * @create 2019/11/30
 * @since 1.0.0
 */
public class DoubleLindedList {

	//初始化头节点
	private HeroNode head = new HeroNode(0, "", "");

	//添加(在最后节点添加)
	public void add(HeroNode newHeroNode){

		HeroNode temp = head;

		while (true){
			if(temp.nextHeroNode == null){
				break;
			}

			temp = temp.nextHeroNode;
		}

		temp.nextHeroNode = newHeroNode;

		newHeroNode.preHeroNode = temp;

	}


	public void addOrderBy(HeroNode newHeroNode){
		HeroNode temp = head;

		boolean isAdd = true;
		while (true){
			if(temp.nextHeroNode == null){
				break;
			}

			if (temp.nextHeroNode.no > newHeroNode.no){
				break;
			}else if(temp.nextHeroNode.no == newHeroNode.no){
				isAdd = false;
				break;
			}

			temp = temp.nextHeroNode;
		}

		if(isAdd){
			newHeroNode.preHeroNode = temp;
			newHeroNode.nextHeroNode = temp.nextHeroNode;

			if(temp.nextHeroNode != null){
				temp.nextHeroNode.preHeroNode = newHeroNode;
			}
			temp.nextHeroNode = newHeroNode;
		}else{
			System.out.println("已存在不能添加");
		}

	}


	public void update(HeroNode newHeroNode) {
		HeroNode temp = head;

		if(temp.nextHeroNode == null){
			System.out.println("空链表");
		}

		boolean isUpdate = false;
		while (true){
			if(temp == null){
				break;
			}

			if (temp.no == newHeroNode.no){
				isUpdate = true;
				break;
			}

			temp = temp.nextHeroNode;
		}

		if(isUpdate){
			temp.name = newHeroNode.name;
			temp.nikeName = newHeroNode.nikeName;
		}else{
			System.out.println("不存在");
		}
	}


	public void delete(int no){
		HeroNode temp = head.nextHeroNode;

		if(temp == null){
			System.out.println("空链表");
		}

		boolean isDelete = false;

		while (true){
			if(temp == null){
				break;
			}

			if (temp.no == no){
				isDelete = true;
				break;
			}

			temp = temp.nextHeroNode;
		}

		if(isDelete){

			if(temp.nextHeroNode != null){
				temp.nextHeroNode.preHeroNode = temp.preHeroNode;

			}
			temp.preHeroNode.nextHeroNode = temp.nextHeroNode;

		}else{
			System.out.println("不存在");
		}
	}
	public void list(){
		if(head.nextHeroNode == null){
			System.out.println("空");
			return;
		}
		HeroNode temp = head.nextHeroNode;
		while (true){
			if(temp == null){
				break;
			}
			System.out.println(temp);

			temp = temp.nextHeroNode;
		}
	}
}

4.测试类

package com.second.week;

/**
 * 〈一句话功能简述〉<br>
 * 〈〉
 *
 * @author PitterWang
 * @create 2019/11/30
 * @since 1.0.0
 */
public class LinkListdDemo {
	public static void main(String[] args) {
		HeroNode heroNode1 = new HeroNode(1,"小王","PJ");

		HeroNode heroNode3 = new HeroNode(3,"小张","HQ");
		HeroNode heroNode2 = new HeroNode(2,"小李","DD");
	    SingleLinkedList singleLinkedList = new SingleLinkedList();
		singleLinkedList.addOrderBy(heroNode1);
		singleLinkedList.addOrderBy(heroNode3);
		singleLinkedList.addOrderBy(heroNode2);



		singleLinkedList.list();
		System.out.println("有效个数节点个数=" +  singleLinkedList.size());


		HeroNode heroNode4= new HeroNode(1,"小王","PJ");

		HeroNode heroNode5 = new HeroNode(4,"小刘","HQ");
		HeroNode heroNode6 = new HeroNode(5,"小狗","DD");
		SingleLinkedList singleLinkedList2 = new SingleLinkedList();
		singleLinkedList2.addOrderBy(heroNode4);
		singleLinkedList2.addOrderBy(heroNode5);
		singleLinkedList2.addOrderBy(heroNode6);

		singleLinkedList2.list();

		System.out.println("有效个数节点个数=" +  singleLinkedList2.size());
		SingleLinkedList s =  new SingleLinkedList();
		HeroNode heroNode = s.mergeList(singleLinkedList.getHeroNode(),singleLinkedList2.getHeroNode());
		s.add(heroNode);

		s.list();

		/*HeroNode newHero = new HeroNode(2,"小赵","ZZ");




		singleLinkedList.update(newHero);
		System.out.println("修改后-------");
		System.out.println("有效个数节点个数=" +  singleLinkedList.size());
		singleLinkedList.list();*/
/*
		singleLinkedList.delete(1);
		System.out.println("删除后-------");
		singleLinkedList.list();
		System.out.println("有效个数节点个数=" +  singleLinkedList.size());

		HeroNode heroNode = singleLinkedList.findLastIndexNode(2);
		System.out.println(heroNode);*/
/*		System.out.println("---------------");
		singleLinkedList.revererNode();
		singleLinkedList.list();*/

/*singleLinkedList.reversePrint();*/




/*
		DoubleLindedList doubleLindedList = new DoubleLindedList();
		doubleLindedList.addOrderBy(heroNode1);
		doubleLindedList.addOrderBy(heroNode3);
		doubleLindedList.addOrderBy(heroNode2);
		doubleLindedList.list();
*/


	/*	System.out.println("更新------------");
		HeroNode newHero = new HeroNode(2,"小赵","ZZ");
		doubleLindedList.update(newHero);
		doubleLindedList.list();
		System.out.println("删除------------");
		doubleLindedList.delete(3);
		doubleLindedList.list();
*/

	}
}

github 源码地址:自学数据结构源码地址

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值