`
阅读更多

双向链表:双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点

package com.dataStructure.linearTable.doubleLinearTable;

public class Student {
	private int id;
	private String name;
	private int score;

	public Student() {

	}
	public Student(int id, String name, int score) {
		this.id = id;
		this.name = name;
		this.score = score;
	}

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	
}

 

package com.dataStructure.linearTable.doubleLinearTable;

public class DoubleLinkList {
	private DoubleLinkList previous = null;
	private Student student;
	private DoubleLinkList next = null;
	
	public DoubleLinkList() {
		
	}

	public DoubleLinkList(Student student) {
		this.student = student;
	}

	public DoubleLinkList getPrevious() {
		return previous;
	}
	public void setPrevious(DoubleLinkList previous) {
		this.previous = previous;
	}
	public Student getStudent() {
		return student;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
	public DoubleLinkList getNext() {
		return next;
	}
	public void setNext(DoubleLinkList next) {
		this.next = next;
	}
	
	
	
}

 

package com.dataStructure.linearTable.doubleLinearTable;

public class Test {
	public static void main(String[] args) {
		//创建头节点
		DoubleLinkList head = new DoubleLinkList();
		Student student1 = new Student(1,"Nicky Zhang",147);
		Student student2 = new Student(2,"Alice Xu",121);
		Student student3 = new Student(5,"Avril Lavigne",99);
		Student student4 = new Student(4,"Britney Spears",127);
		Student student5 = new Student(3,"Whitney Houston",150);
		DoubleLinkList item1 = new DoubleLinkList(student1);
		DoubleLinkList item2 = new DoubleLinkList(student2);
		DoubleLinkList item3 = new DoubleLinkList(student3);
		DoubleLinkList item4 = new DoubleLinkList(student4);
		DoubleLinkList item5 = new DoubleLinkList(student5);
		add(head, item1);
		add(head, item2);
		add(head, item3);
		add(head, item4);
		add(head, item5);
		remove(head, item1);
		remove(head, item3);
		getAll(head);
	}
	/**
	 * add item
	 * @param head
	 * @param item
	 */
	private static void add(DoubleLinkList head, DoubleLinkList item){
		if(head == null || item == null){
			return;
		}
		//头结点 不能动
		DoubleLinkList current = head;
		//check current element if exists
		boolean flag = false;
		//check current linkList is Empty
		if(current.getNext() == null){
			current.setNext(item);
			item.setPrevious(current);
		}else{
			//如果不是空节点,按照顺序来添加
			//寻找添加位置
			while(current.getNext() != null){
				if(current.getNext().getStudent().getId() > item.getStudent().getId()){
					break;
				}
				if(current.getNext().getStudent().getId() == item.getStudent().getId()){
					flag = true;
				}
				current = current.getNext();
			}
			if(!flag){
				item.setNext(current.getNext());
				item.setPrevious(current);
				current.setNext(item);
				if(item.getNext() != null){
					item.getNext().setPrevious(item);
				}
			}
		}
	}
	/**
	 * remove item
	 * @param head
	 * @param item
	 */
	private static void remove(DoubleLinkList head, DoubleLinkList item){
		if(head == null || item == null){
			return;
		}
		DoubleLinkList current = head.getNext();

		boolean flag = false;
		while(current != null){
			if(current.getStudent().getId() == item.getStudent().getId()){
				flag = true;
				break;
			}
			current = current.getNext();
		}
		if(flag){
			if(current.getNext() != null){
				current.getNext().setPrevious(current.getPrevious());
			}
			current.getPrevious().setNext(current.getNext());
		}
	}
	/**
	 * Query All Elements
	 * @param head
	 */
	private static void getAll(DoubleLinkList head){
		DoubleLinkList current = head;
		while(current.getNext() != null){
			System.out.println("ID :"+current.getNext().getStudent().getId()+" Name :"+current.getNext().getStudent().getName());
			current = current.getNext();
		}
	}
}

 

分享到:
评论

相关推荐

    双向链表双向链表双向链表

    http://msdn.microsoft.com/en-us/library/95z04bas(v=VS.71).aspx 双向链表

    双向链表的操作

    双向链表的操作问题 Time Limit: 1000MS Memory Limit: 10000KB Submissions: 111 Accepted: 41 Description 建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成...

    双向链表双向链表

    双向链表

    双向链表实现结点类

    定义、实现并测试一个双向链表结点类DNode。 链表结点类中包含私有数据成员为两个整数x,y以及左结点指针left及右结点指针right。 包含的函数成员包括: (a)对结点的数据成员赋值setDNodeValues(int,int,DNode* ...

    Linux内核双向链表简单分析

    详细的介绍了Linux内核中使用的最频繁的双向链表

    双向链表.cpp 双向链表类定义及测试代码 c++

    双向链表类定义及测试文件 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材

    支持类模版的C++双向链表

    一种支持类模版和函数模版的C++双向链表,实现了各种排序算法(排序原则可定制),包含学生信息的使用示例(VC 6.0、VS2008).

    双向链表的增删改查

    实现双向链表的增删改查功能,dos窗口输入输出,可运行,有注释

    C 语言版 双向链表

    C 语言版 双向链表 #include #include typedef struct list { int date; struct list *llink; struct list *rlink; }st; st *creat () //创建双向链表 { st *head , *p , *q; head = q = p = NULL; int ...

    创建双向链表_双向链表_

    通过建立双向链表,来实现双向查找,增加和删除的功能

    双向链表通用管理程序(添加节点、删除节点等等)

    双向链表是一种比较常用的数据结构,在许多场合都有应用。但是,双向链表的节点操作,对于初学者来说或许显得比较繁琐。尤其是,当用链表描述不同的数据结构时,节点结构体的定义都是不同的,这就需要为每一种链表都...

    stm32f103 双向链表

    使用stm32f103 建立双向链表demo,适用所有链表情况,非常好用,链表部分采用了Linux list

    操作系统课设-线程安全的双向链表

    原创手操,操作系统课设,线程安全的双向链表,VC6.0,无须配置,可运行

    双向链表 - 数据结构与算法 C 请看!

    双向链表 - 数据结构与算法 C 双向链表 - 数据结构与算法 C 。。。。。。

    双向链表模板类简单实现

    用模板类实现了一个简单的双向链表domo。

    大数阶乘 双向链表

    用双向链表实现大数阶乘 输入一个不限制大小的数 即可计算出它的阶乘

    循环双向链表(C语言)

    循环双向链表,实现了插入、查找特定的节点、删除等功能,是自己花了半天的时间写完的。

    实现双向链表反转

    基于linkedList实现自己的双向链表反转。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

    双向链表的C++实现

    基础数据结构双向链表的C++描述版。实现了双向链表的基本功能。包括拷贝构造函数和IO操作符重载、赋值操作符重载

    C语言数组型双向链表的处理

    ALIST是一段基于C语言的数组型双向链表的处理代码,接口简单明了,易于使用,标准C语言开发,可添加在任何C/C++语言工程中,需要注意的是,如果使用了操作系统,请自行在库中修改指向处添加资源锁定,避免因操作系统...

Global site tag (gtag.js) - Google Analytics