java实现单链表常见操作
一、概述:
本文主要总结单链表常见操作的实现,包括链表结点添加、删除;链表正向遍历和反向遍历、链表排序、判断链表是否有环、是否相交、获取某一结点等。
二、概念:
链表:
一种重要的数据结构,HashMap等集合的底层结构都是链表结构。链表以结点作为存储单元,这些存储单元可以是不连续的。每个结点由两部分组成:存储的数值+前序结点和后序结点的指针。即有前序结点的指针又有后序结点的指针的链表称为双向链表,只包含后续指针的链表为单链表,本文总结的均为单链表的操作。
单链表结构:
先定义一个节点
package com.example.demo.opera;
public class Node {
Node next = null;//下一个结点
int data;//结点数据
public Node(int data){
this.data = data;
}
}
package com.example.demo.service;
/*
* 定义一个单链表接口
* */
public interface Done {
void addNode(int data);
void printLink();
int length();
boolean deleteNode(int index);
}
单链表的相关增删遍历
package com.example.demo.opera;
import com.example.demo.service.Done;
/*
* 单链表操作
* */
public class Opera implements Done {
/**链表的头结点*/
Node head = null;
/**
* 链表添加结点:
* 找到链表的末尾结点,把新添加的数据作为末尾结点的后续结点
* @param data
*/
public void addNode(int data){
Node newNode = new Node(data);
//如果头节点为空 新的节点就是头节点
if(head == null){
head = newNode;
return;
}
//定义一个指针
Node temp = head;
//找到链表的末尾结点
while(temp.next != null){
temp = temp.next;
}
//将数据放到尾部节点
temp.next = newNode;
}
/**
* 打印结点
*/
public void printLink(){
//当前节点等于头节点
Node curNode = head;
while(curNode !=null){
//打印当前节点
System.out.print(curNode.data+" ");
curNode = curNode.next;
}
System.out.println();
}
/**
* 求链表的长度
* @return
*/
public int length(){
int length = 0;
Node curNode = head;
while(curNode != null){
length++;
curNode = curNode.next;
}
return length;
}
/**
* 链表删除结点:
* 把要删除结点的前结点指向要删除结点的后结点,即直接跳过待删除结点
* @param index
* @return
*/
public boolean deleteNode(int index){
if(index<0 || index>length()){//待删除结点不存在
return false;
}
if(index == 0){//删除头结点
head = head.next;
return true;
}
Node preNode = head;
Node curNode = preNode.next;
int i = 1;
while(curNode != null){
if(i==index){//寻找到待删除结点
preNode.next = curNode.next;//待删除结点的前结点指向待删除结点的后结点
return true;
}
//当先结点和前结点同时向后移
preNode = preNode.next;
curNode = curNode.next;
i++;
}
return true;
}
}