链表
单链表
双向链表
链表的基本操作
查找节点
时间复杂度O(n)
/**
* 查找链表元素
* @param index
* @return
*/
public Node get(int index){
if(index<0 || index >=size){
System.out.println("超出了链表的查找范围!");
return null;
}
Node temp = head; // 创建临时节点
for(int i=0;i<index;i++){
temp = temp.next;
}
return temp;
}
更新节点
/**
* 更新链表的元素
* @param index
* @param data
*/
public void update(int index,int data){
if(index<0 || index>= size){
System.out.println("超出链表的范围!");
return;
}
Node node = get(index);
node.data = data;
}
插入节点
/**
* 插入节点
* @param index
* @param data
*/
public void insert(int index,int data){
if(index<0 || index>size){
System.out.println("插入链表的插入范围!");
return;
}
//创建一个节点
Node insertedNode = new Node(data);
if(size==0){
//空链表
head = insertedNode;
last = insertedNode;
}else if(index==0){
// 从头部插入
insertedNode.next = head;
head = insertedNode;
}else if(index == size){
//从尾部插入
last.next = insertedNode;
last = insertedNode;
}else{
//中间插入
Node prevNode = get(index-1); //获取插入节点的上一个节点
insertedNode.next = prevNode.next;
prevNode.next = insertedNode;
}
size++;
}
删除节点
/**
* 删除链表中的节点
* @param index
*/
public void remove(int index){
if(index<0 || index >=size){
System.out.println("超出了链表的范围!");
return ;
}
if(index == 0){
//头部删除
Node node = get(index);
head = node.next;
}else if(index == size-1){
//尾部删除
Node provNode = get(index-1);
provNode.next = null;
last = provNode;
}else{
//中间删除
Node provNode = get(index-1);
provNode.next = provNode.next.next;
}
size--;
}
完整的代码:
package 链表;
public class MyLinklist {
private Node head; // 头节点指针
private Node last; // 尾节点指针
private int size; // 链表的长度
/**
* 链表节点
* @author hecha
*
*/
public static class Node{
int data;
Node next;
Node(int data){
this.data = data;
}
}
/**
* 插入节点
* @param index
* @param data
*/
public void insert(int index,int data){
if(index<0 || index>size){
System.out.println("插入链表的插入范围!");
return;
}
//创建一个节点
Node insertedNode = new Node(data);
if(size==0){
//空链表
head = insertedNode;
last = insertedNode;
}else if(index==0){
// 从头部插入
insertedNode.next = head;
head = insertedNode;
}else if(index == size){
//从尾部插入
last.next = insertedNode;
last = insertedNode;
}else{
//中间插入
Node prevNode = get(index-1); //获取插入节点的上一个节点
insertedNode.next = prevNode.next;
prevNode.next = insertedNode;
}
size++;
}
/**
* 更新链表的元素
* @param index
* @param data
*/
public void update(int index,int data){
if(index<0 || index>= size){
System.out.println("超出链表的范围!");
return;
}
Node node = get(index);
node.data = data;
}
/**
* 删除链表中的节点
* @param index
*/
public void remove(int index){
if(index<0 || index >=size){
System.out.println("超出了链表的范围!");
return ;
}
if(index == 0){
//头部删除
Node node = get(index);
head = node.next;
}else if(index == size-1){
//尾部删除
Node provNode = get(index-1);
provNode.next = null;
last = provNode;
}else{
//中间删除
Node provNode = get(index-1);
provNode.next = provNode.next.next;
}
size--;
}
/**
* 查找链表元素
* @param index
* @return
*/
public Node get(int index){
if(index<0 || index >=size){
System.out.println("超出了链表的查找范围!");
return null;
}
Node temp = head; // 创建临时节点
for(int i=0;i<index;i++){
temp = temp.next;
}
return temp;
}
/**
* 查看链表所有元素
* @param args
*/
public void output(){
Node temp = head;
for(int i=0;i<size;i++){
System.out.println(temp.data);
temp = temp.next;
}
}
public static void main(String[] args) {
MyLinklist ll = new MyLinklist();
ll.insert(0, 20);
ll.insert(1,3);
ll.insert(2,99);
ll.output(); // 输出所有元素
System.out.println("----------");
ll.insert(1, 55);
ll.update(0, 21);
ll.output(); // 输出所有元素
System.out.println("----------");
ll.remove(0);
ll.remove(1);
ll.remove(1);
ll.output(); // 输出所有元素
}
}
数组VS链表