前置知识
1.链表:逻辑上连续,物理上不联系
2.车厢类:
Node{
int data;//存储具体元素
Node next;//存储下一个节点的地址
}
3.火车类:
SingleLinkedList{
int size;//火车车厢个数
Node head;//当前火车的头结点
}
单链表
package seqlist;
//车厢类
class Node{
//存储具体元素
int data;
//存储下一个节点的地址(钩子)
Node next;
public Node(int data) {
this.data = data;
}
public Node(int data, Node next) {
this.data = data;
this.next = next;
}
}
//火车类
public class SingleLinkedList {
//当前火车的车厢个数
private int size;
//当前火车的头结点
private Node head;
public void addFirst(int data){
if(size == 0){
Node node = new Node(data);
head = node;
size ++;
}else{
Node node = new Node(data);
node.next = head;
head = node;
size ++;
}
}
/**
* 在任意位置插入元素
* @param data
* @param index
*/
public void addIndex(int index,int data){
//判断index是否合法
if(index < 0 || index > size){
System.err.println("addIndex illegal!");
return;
}
//特殊节点位置,头插
if(index == 0){
addFirst(data);
return;
}
//说明此时index合法且在中间位置(包含最后节点)
Node node = new Node(data);
//此时需要找到待插入位置的前驱节点
Node prev = head;
for (int i = 0; i < index - 1; i++) {
prev = prev.next;
}
node.next = prev.next;
prev.next = node;
size ++;
}
public void addLast(int data){
addIndex(size,data);
}
/**
* 查询index位置的节点数据
* @param index
* @return
*/
public int get(int index){
if(rangeCheck(index)){
Node node = head;
for (int i = 0; i < index; i++) {
node = node.next;
}
//此时node指向带查找元素的索引
int data = node.data;
return data;
}else{
System.err.println("get index illegal!");
return -1;
}
}
/**
* 修改单链表中index位置的元素
* 返回修改前的元素
* @param index
* @param data
* @return
*/
public int set(int index,int data){
if(rangeCheck(index)){
//需要找到index位置的元素
Node node =head;
for (int i = 0; i < index; i++) {
node = node.next;
}
int oldData = node.data;
node.data = data;
return oldData;
}else{
System.err.println("set index illegal!");
return -1;
}
}
/**
* 判断是否包含元素data
* @param data
* @return
*/
public boolean contains(int data){
Node node = head;
while (node != null){
if (node.data == data){
System.out.println("找到该元素");
return true;
}
node = node.next;
}
System.out.println("没有找到该元素");
return false;
}
public void removeFirst(){
Node node = head;
head = head.next;
node.next = null;
size --;
}
/**
* 删除待删除节点的第一个元素
* @param data
*/
public void removeValueOnce(int data){
if(head.data == data){
removeFirst();
}else{
Node prev = head;
while(prev.next != null){
if(prev.next.data == data){
Node node = prev.next;
prev.next = node.next;
node.next = null;
size --;
break;
}else{
prev = prev.next;
}
}
}
}
public void removeAllValue(int data){
//头结点及以后出现了多个连续待删除的节点
while(head != null && head.data == data){
Node node = head;
head = head.next;
node.next = null;
size --;
}
if(head == null){
return;
}else{
Node prev = head;
while(prev.next != null){
if(prev.next.data == data){
Node node = prev.next;
prev.next = node.next;
node.next = null;
size --;
}
prev = prev.next;
}
}
}
public void removeIndex(int index){
if(rangeCheck(index)){
if(index == 0){
removeFirst();
}else{
//此时index删除的是中间位置
//寻找前驱节点
Node prev = head;
for (int i = 0; i < index - 1; i++) {
prev = prev.next;
}
Node node = prev.next;
prev.next = node.next;
node.next = null;
size --;
}
}else{
System.err.println("removeIndex illegal!");
}
}
/**
* 判断index是否合法(删,改,查)
* @param index
* @return
*/
private boolean rangeCheck(int index){
if(index < 0 || index >= size){
return false;
}
return true;
}
//实现火车的遍历
public String toString(){
String ret = "";
Node node = head;
while (node != null){
ret += node.data + "->";
node = node.next;
}
ret += "NULL";
return ret;
}
public static void main(String[] args) {
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.addLast(1);
singleLinkedList.addLast(3);
singleLinkedList.addLast(5);
singleLinkedList.addFirst(7);
singleLinkedList.addIndex(2,10);
//7-1-10-3-5
System.out.println(singleLinkedList);
//5
//System.out.println(singleLinkedList.get(4));
//false
//System.out.println(singleLinkedList.contains(20));
//System.out.println(singleLinkedList.set(2,20));
//singleLinkedList.removeFirst();
singleLinkedList.removeIndex(1);
System.out.println(singleLinkedList);
}
}