链表
来源:互联网 发布:uc2监控软件账号注册 编辑:程序博客网 时间:2024/06/06 02:24
链接点
链表由链接点对象构成,链接点对象中包含我们的数据,链接点通过节点实例相互关联。
通过上面图形,可以得到链表的基本条件,根节点,链接点对象,以及节点对象中包含的Data数据。
单链表:只有链表头first,每个链节点只有向后next的引用或者向前previous的引用
单链表的基本操作
1、链表头插入一个数据 insertFirst(Link link)
Link newLink = new Link();
newLink.next = first;
first = newLink;
2、在链表头删除一个数据 deleteFirst()
Link temp = first;
first = first.next;
return temp;
3、遍历链表displayLinkedList()
4、find(String key) 循环遍历链表,查看数据中是否有key值,若没有则返回null
5、delete(String key)若找到key,则删除该节点。
java代码实现单链表
//链表,代码只是为了演示。public class LinkedList { private Link first; //链表必须有一个根节点存在,表示链表头 public LinkedList() { first = null; } public void insertFirst(Link newLink) { newLink.next = first; first = newLink; } public Link deleteFirst() { //存在数据的情况下 Link temp = first; first = first.next; return temp; } public Link find(String name) { //通过名字查找 Link current = first; while (first!=null && !current.data.getName().equals(name)) { current = current.next; if (current == null) current = null; } return current; } public Link delete(String name) { //删除指定名字的节点 Link current = first; Link previous = first; while (first!=null && !current.data.getName().equals(name)) { previous = current; current = current.next; if (current == null) current = null; } if (current ==first) deleteFirst(); else previous.next = current.next; return current; } public void displayLinkedList() { Link current = first; while (current != null) { current.displayLink(current); current = current.next; } } public boolean isEmpty() { return first == null; } public void clear() { //清空链表 first = null; } public static void main(String[] args) { LinkedList list = new LinkedList(); //创建链表 list.insertFirst(new Link(new Data("张三","成都","22"))); //插入四条带数据的连接点 list.insertFirst(new Link(new Data("李四","上海","35"))); list.insertFirst(new Link(new Data("王五","北京","15"))); list.insertFirst(new Link(new Data("六六","西藏","27"))); list.displayLinkedList(); //遍历该链表 /* 结果为: Data{name='六六', address='西藏', age='27'} Data{name='王五', address='北京', age='15'} Data{name='李四', address='上海', age='35'} Data{name='张三', address='成都', age='22'} */ Link find = list.find("张三"); find.displayLink(find); //查找结果为:Data{name='张三', address='成都', age='22'} Link delete = list.delete("六六"); delete.displayLink(delete); //Data{name='六六', address='西藏', age='27'} list.displayLinkedList(); /* 结果为: Data{name='王五', address='北京', age='15'} Data{name='李四', address='上海', age='35'} Data{name='张三', address='成都', age='22'} */ Link link = list.deleteFirst(); //删除链表头的数据 link.displayLink(link); //结果为:Data{name='王五', address='北京', age='15'} }}//创建链接点对象class Link { public Data data; public Link next; public Link(Data data) { this.data = data; next = null; } public void displayLink(Link link) { System.out.println(link.data); }}//创建类封装我们的数据class Data { private String name; private String address; private String age; public Data(String name, String address, String age) { this.name = name; this.address = address; this.age = age; } public String getName() { return name; } @Override public String toString() { return "Data{" + "name='" + name + '\'' + ", address='" + address + '\'' + ", age='" + age + '\'' + '}'; }}
双向链表
双向链表不同的地方在于,根节点包含first和last两个引用,既可以向前遍历,也可以向后
遍历。因此,每个链接点中除了data数据外,还应该包含向前或者向后的引用。
双向链表的部分操作以及java代码实现。
public class DoubleLinkedList { private Link first; //根节点链表头引用 private Link last; //根节点链表尾引用 public DoubleLinkedList() { //初始化 first = null; last = null; } public void insertFirst(Link newLink) { if (isEmpty()) { //如果链表为空 last = newLink; } else { first.prev = newLink; } newLink.next = first; //最后两个条件无论如何都要执行 first = newLink; } public void insertLast(Link newLink) { if (isEmpty()) { first = newLink; } else { newLink.prev = last; last.next = newLink; } last = newLink; } public boolean insertAfter(int key) { Link newLink = new Link(key); Link current = first; while (current.data != key) { current = current.next; if (current == null) return false; } if (current == last) { newLink.next = null; last = newLink; } else { newLink.next = current.next; current.next.prev = newLink; } current.next = newLink; newLink.prev = current; return true; } public boolean isEmpty() { return first == null; }}//创建节点,数据用data表示,包含向前或者向后的引用class Link { public int data; public Link prev; public Link next; public Link(int data) { this.data = data; prev = null; next = null; }}
阅读全文
1 0
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- python3爬虫超简单实例
- 抽样工厂模式
- DAY8 网络设置以及 安装软件
- [LeetCode] Palindrome Partitioning I&II
- 柯洁被AlphaGo算法“玩”了,不必内疚自责
- 链表
- Sublime Text3中输入meta、img、input等标签时自动闭合问题
- Min Cost Path
- /\/\/\/\/\
- GitHub完美适配Visual Studio-03 更改
- 51Nod-1018 排序【排序】
- spring中多数据源配置
- Java多线程
- 51Nod-1179 最大的最大公约数【暴力】