- Java 数据结构与算法 教程
- Java 数据结构与算法 - 首页
- Java 数据结构与算法 - 概述
- Java 数据结构与算法 - 环境搭建
- Java 数据结构与算法 - 算法
- Java 数据结构与算法 - 数据结构
- Java 数据结构与算法 - 数组
- Java 数据结构与算法 - 链表
- Java 数据结构与算法 - 双向链表
- Java 数据结构与算法 - 循环链表
- Java 数据结构与算法 - 栈
- 数据结构与算法 - 表达式解析
- Java 数据结构与算法 - 队列
- Java 数据结构与算法 - 优先队列
- Java 数据结构与算法 - 树
- Java 数据结构与算法 - 哈希表
- Java 数据结构与算法 - 堆
- Java 数据结构与算法 - 图
- Java 数据结构与算法 - 搜索技术
- Java 数据结构与算法 - 排序技术
- Java 数据结构与算法 - 递归
- Java 数据结构与算法 有用资源
- Java 数据结构与算法 - 快速指南
- Java 数据结构与算法 - 有用资源
- Java 数据结构与算法 - 讨论
Java 数据结构与算法 - 链表
链表基础
链表是由一系列链接组成的序列,每个链接包含一个指向另一个链接的连接。链表是仅次于数组的第二常用数据结构。以下是理解链表概念的重要术语。
链接 − 链表的每个链接都可以存储称为元素的数据。
下一个 − 链表的每个链接都包含一个指向下一个链接的链接,称为“下一个”。
链表 − 链表包含一个指向第一个链接的连接,称为“第一个”。
链表表示
根据上面所示的图示,以下是需要考虑的重要几点。
链表包含一个称为“第一个”的链接元素。
每个链接都包含一个或多个数据字段和一个称为“下一个”的链接字段。
每个链接都使用其“下一个”链接与其下一个链接链接。
最后一个链接的链接为 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; }
导航操作
导航是一个递归步骤过程,是许多操作(如搜索、删除等)的基础。
获取第一个链接指向的链接作为当前链接。
检查当前链接是否不为 null 并显示它。
将当前链接指向当前链接的下一个链接,并移动到上述步骤。
注意
//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; }
演示
Link.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+"}"); } }LinkedList.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} ]