- DSA 使用 Java 教程
- 使用 Java 的 DSA - 主页
- 使用 Java 的 DSA - 概述
- 使用 Java 的 DSA - 环境设置
- 使用 Java 的 DSA - 算法
- 使用 Java 的 DSA - 数据结构
- 使用 Java 的 DSA - 数组
- 使用 Java 的 DSA - 链表
- 使用 Java 的 DSA - 双向链表
- 使用 Java 的 DSA - 循环链表
- 使用Java的DSA - 堆栈内存溢出
- DSA - 解析表达式
- 使用 Java 的 DSA - 队列
- 使用 Java 的 DSA - 优先级队列
- 使用 Java 的 DSA - 树
- 使用 Java 的 DSA - 哈希表
- 使用 Java 的 DSA - 堆
- 使用 Java 的 DSA - 图
- 使用 Java 的 DSA - 搜索技术
- 使用 Java 的 DSA - 排序技术
- 使用 Java 的 DSA - 递归
- 使用 Java 的 DSA 有用资源
- 使用 Java 的 DSA - 快速指南
- 使用 Java 的 DSA - 有用资源
- 使用 Java 的 DSA - 讨论
使用 Java 的 DSA - 链表
链表基础知识
链接列表是包含项目的链接序列。每个链接都包含到另一个链接的连接。链表是继数组之后第二常用的数据结构。以下是理解链表概念的重要术语。
链接- 链表的每个链接都可以存储称为元素的数据。
Next - 链接列表的每个链接都包含一个指向下一个链接的链接,称为“Next”。
LinkedList - LinkedList 包含指向名为 First 的第一个链接的连接链接。
链表表示
根据上图所示,以下是需要考虑的要点。
LinkedList 包含一个名为first 的链接元素。
每个链接携带一个数据字段和一个接下来调用的链接字段。
每个链接都使用其下一个链接与其下一个链接进行链接。
Last Link 带有一个为 null 的 Link 来标记列表的结尾。
链表的类型
以下是链表的各种风格。
简单链接列表- 项目导航仅向前。
双向链表- 项目可以向前和向后导航。
循环链表- 最后一项包含第一个元素作为下一个元素的链接,第一个元素包含到最后一个元素作为上一个元素的链接。
基本操作
以下是列表支持的基本操作。
插入- 在列表的开头添加一个元素。
删除- 删除列表开头的元素。
显示- 显示完整列表。
搜索- 使用给定键搜索元素。
删除- 使用给定键删除元素。
插入操作
插入过程分为三个步骤:
使用提供的数据创建新链接。
将新链接指向旧的第一个链接。
将第一个链接指向此新链接。
//insert link at the first location public void insertFirst(int key, int data){ //create a link Link link = new Link(key,data); //point it to old first node link.next = first; //point first to new first node first = link; }
删除操作
删除过程分为两步:
获取第一个链接指向的链接作为临时链接。
将第一个链接指向临时链接的下一个链接。
//delete first item public Link deleteFirst(){ //save reference to first link Link tempLink = first; //mark next to first link as first first = first.next; //return the deleted link return tempLink; }
导航操作
导航是一个递归步骤过程,是许多操作(如搜索、删除等)的基础:
获取第一个链接指向的链接作为当前链接。
检查当前链接是否不为空并显示它。
将当前链接指向当前链接的下一个链接并移至上述步骤。
笔记
//display the list public void display(){ //start from the beginning Link current = first; //navigate till the end of the list System.out.print("[ "); while(current != null){ //print data current.display(); //move to next item current = current.next; System.out.print(" "); } System.out.print(" ]"); }
高级操作
以下是为列表指定的高级操作。
排序- 根据特定顺序对列表进行排序。
反转- 反转链表。
连接- 连接两个列表。
排序操作
我们使用冒泡排序来对列表进行排序。
public void sort(){ int i, j, k, tempKey, tempData ; Link current,next; int size = length(); k = size ; for ( i = 0 ; i < size - 1 ; i++, k-- ) { current = first ; next = first.next ; for ( j = 1 ; j < k ; j++ ) { if ( current.data > next.data ) { tempData = current.data ; current.data = next.data; next.data = tempData ; tempKey = current.key; current.key = next.key; next.key = tempKey; } current = current.next; next = next.next; } } }
反向操作
以下代码演示了反转单个链表。
public LinkedList reverse() { LinkedList reversedlist = new LinkedList(); Link nextLink = null; reversedlist.insertFirst(first.key, first.data); Link currentLink = first; // Until no more data in list, // insert current link before first and move ahead. while(currentLink.next != null){ nextLink = currentLink.next; // Insert at start of new list. reversedlist.insertFirst(nextLink.key, nextLink.data); //advance to next node currentLink = currentLink.next; } return reversedlist; }
连接操作
以下代码演示了反转单个链表。
public void concatenate(LinkedList list){ if(first == null){ first = list.first; } if(list.first == null){ return; } Link temp = first; while(temp.next !=null) { temp = temp.next; } temp.next = list.first; }
演示
链接.javapackage com.tutorialspoint.list; public class Link { public int key; public int data; public Link next; public Link(int key, int data){ this.key = key; this.data = data; } public void display(){ System.out.print("{"+key+","+data+"}"); } }链表.java
package com.tutorialspoint.list; public class LinkedList { //this link always point to first Link //in the Linked List private Link first; // create an empty linked list public LinkedList(){ first = null; } //insert link at the first location public void insertFirst(int key, int data){ //create a link Link link = new Link(key,data); //point it to old first node link.next = first; //point first to new first node first = link; } //delete first item public Link deleteFirst(){ //save reference to first link Link tempLink = first; //mark next to first link as first first = first.next; //return the deleted link return tempLink; } //display the list public void display(){ //start from the beginning Link current = first; //navigate till the end of the list System.out.print("[ "); while(current != null){ //print data current.display(); //move to next item current = current.next; System.out.print(" "); } System.out.print(" ]"); } //find a link with given key public Link find(int key){ //start from the first link Link current = first; //if list is empty if(first == null){ return null; } //navigate through list while(current.key != key){ //if it is last node if(current.next == null){ return null; }else{ //go to next link current = current.next; } } //if data found, return the current Link return current; } //delete a link with given key public Link delete(int key){ //start from the first link Link current = first; Link previous = null; //if list is empty if(first == null){ return null; } //navigate through list while(current.key != key){ //if it is last node if(current.next == null){ return null; }else{ //store reference to current link previous = current; //move to next link current = current.next; } } //found a match, update the link if(current == first) { //change first to point to next link first = first.next; }else { //bypass the current link previous.next = current.next; } return current; } //is list empty public boolean isEmpty(){ return first == null; } public int length(){ int length = 0; for(Link current = first; current!=null; current = current.next){ length++; } return length; } public void sort(){ int i, j, k, tempKey, tempData ; Link current,next; int size = length(); k = size ; for ( i = 0 ; i < size - 1 ; i++, k-- ) { current = first ; next = first.next ; for ( j = 1 ; j < k ; j++ ) { if ( current.data > next.data ) { tempData = current.data ; current.data = next.data; next.data = tempData ; tempKey = current.key; current.key = next.key; next.key = tempKey; } current = current.next; next = next.next; } } } public LinkedList reverse() { LinkedList reversedlist = new LinkedList(); Link nextLink = null; reversedlist.insertFirst(first.key, first.data); Link currentLink = first; // Until no more data in list, // insert current link before first and move ahead. while(currentLink.next != null){ nextLink = currentLink.next; // Insert at start of new list. reversedlist.insertFirst(nextLink.key, nextLink.data); //advance to next node currentLink = currentLink.next; } return reversedlist; } public void concatenate(LinkedList list){ if(first == null){ first = list.first; } if(list.first == null){ return; } Link temp = first; while(temp.next !=null) { temp = temp.next; } temp.next = list.first; } }LinkedListDemo.java
package com.tutorialspoint.list; public class LinkedListDemo { public static void main(String args[]){ LinkedList list = new LinkedList(); list.insertFirst(1, 10); list.insertFirst(2, 20); list.insertFirst(3, 30); list.insertFirst(4, 1); list.insertFirst(5, 40); list.insertFirst(6, 56); System.out.print("\nOriginal List: "); list.display(); System.out.println(""); while(!list.isEmpty()){ Link temp = list.deleteFirst(); System.out.print("Deleted value:"); temp.display(); System.out.println(""); } System.out.print("List after deleting all items: "); list.display(); System.out.println(""); list.insertFirst(1, 10); list.insertFirst(2, 20); list.insertFirst(3, 30); list.insertFirst(4, 1); list.insertFirst(5, 40); list.insertFirst(6, 56); System.out.print("Restored List: "); list.display(); System.out.println(""); Link foundLink = list.find(4); if(foundLink != null){ System.out.print("Element found: "); foundLink.display(); System.out.println(""); }else{ System.out.println("Element not found."); } list.delete(4); System.out.print("List after deleting an item: "); list.display(); System.out.println(""); foundLink = list.find(4); if(foundLink != null){ System.out.print("Element found: "); foundLink.display(); System.out.println(""); }else{ System.out.print("Element not found. {4,1}"); } System.out.println(""); list.sort(); System.out.print("List after sorting the data: "); list.display(); System.out.println(""); System.out.print("Reverse of the list: "); LinkedList list1 = list.reverse(); list1.display(); System.out.println(""); LinkedList list2 = new LinkedList(); list2.insertFirst(9, 50); list2.insertFirst(8, 40); list2.insertFirst(7, 20); list.concatenate(list2); System.out.print("List after concatenation: "); list.display(); System.out.println(""); } }
如果我们编译并运行上面的程序,那么它将产生以下结果:
Original List: [ {6,56} {5,40} {4,1} {3,30} {2,20} {1,10} ] Deleted value:{6,56} Deleted value:{5,40} Deleted value:{4,1} Deleted value:{3,30} Deleted value:{2,20} Deleted value:{1,10} List after deleting all items: [ ] Restored List: [ {6,56} {5,40} {4,1} {3,30} {2,20} {1,10} ] Element found: {4,1} List after deleting an item: [ {6,56} {5,40} {3,30} {2,20} {1,10} ] Element not found. {4,1} List after sorting the data: [ {1,10} {2,20} {3,30} {5,40} {6,56} ] Reverse of the list: [ {6,56} {5,40} {3,30} {2,20} {1,10} ] List after concatenation: [ {1,10} {2,20} {3,30} {5,40} {6,56} {7,20} {8,40} {9,50} ]