Java单链表[增删改查]
Posted 王嘻嘻-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java单链表[增删改查]相关的知识,希望对你有一定的参考价值。
- 添加节点 addIndex(int index,int val);在单链表任意index位置添加元素val ps:找待插入位置的前驱;
- 查找元素 get(int index);根据inedx查找对应的值;
- 修改节点 set(int index,int newVal);当前链表中索引为 index 的节点值改为newVal;
- 删除节点 removeIndex(int index);删除单链表中指定索引对应的元素;
代码:
package seqlist;
/**
* 火车类,有多个车厢拼接在一起
*/
public class SingleLinkedList
private int size;
private Node head;
/**
* 在火车头部添加元素——添加一个车厢节点
* @param val
*/
public void addFirst(int val)
//新建一个车厢节点
Node node = new Node(val);
//判断火车是否为空
if(head == null)
//火车为空
head = node;
else
//火车中有节点,新车厢挂在火车头部
node.next=head;
head=node;
//最后火车车厢++
size++;
/**
* 在单链表任意index位置添加元素val
* @param index
* @param val
*/
public void addIndex(int index,int val)
//合法性
if (index < 0 || index > size)
System.err.println("add index illegal!");
return;
//头插 调用 addFirst
if (index == 0)
addFirst(val);
return;
//插入元素 先创建一个新节点
Node node = new Node(val);
//找到待插入位置的前驱,从头节点依次向后走index-1步(遍历)\\
Node prev = head;
for (int i = 0; i < index-1; i++)
prev=prev.next;
//插入 prev 指向的是待插入位置的前驱节点
node.next = prev.next;
prev.next = node;
size++;
/**
* 在单链表尾部插入元素,直接调用addIndex方法
* @param val
*/
public void addLast(int val)
addIndex(size,val);
/**
* 根据inedx查找对应的值
* @param index
* @return
*/
public int get(int index)
//判断合法性(单独弄个方法)
if (rangeCheck(index))
Node node = head;
//遍历单链表,从头到index
//规定node节点走的步数
for (int i = 0; i < index; i++)
node=node.next;
return node.val;
else
System.err.println("get index illegal!");
return -1;
/**
* 判断当前单链表是否包含值为 val 的节点
* @param val
* @return
*/
public boolean contains(int val)
for (Node temp = head;temp != null;temp =temp.next)
if (temp.val==val)
return true;
return false;
/**
* 当前链表中索引为 index 的节点值改为newVal
* @param index
* @param newVal
* @return 修改之前的值
*/
public int set(int index,int newVal)
if (rangeCheck(index))
Node node = head;
for (int i = 0; i < index; i++)
node=node.next;
int oldVal = node.val;
node.val=newVal;
return oldVal;
else
System.err.println("set index illegal!");
return -1;
/**
* 删除单链表中指定索引对应的元素
* @param index
*/
public void removeIndex(int index)
if (rangeCheck(index))
//边界 删除头节点的情况
if (index==0)
Node temp = head;
head = head.next;
temp.next = null;
size--;
else
//删除中间位置
Node prev = head; //prev待删除节点的前驱
for (int i = 0; i < index-1; i++)
prev=prev.next;
Node cur = prev.next; //待删除节点
prev.next = cur.next;
cur.next = null;
size--;//车厢有效元素size--
else
System.err.println("remove index illegal!");
/**
* 删除头节点 令其index为0即可
*/
public void removeFirst()
removeIndex(0);
/**
* 删除尾节点 令其index为 size-1 即可
*/
public void removeLast()
removeIndex(size-1);
/**
* 删除第一次出现的val值
* @param val
*/
public void removeValueOnce(int val)
// 遍历链表,找到值为val的节点 -> 不知道值为val的节点在哪个位置
// 找到后删除(正常的删除都需要找到前驱,只有头节点没前驱)
if (head!=null && head.val==val)
// 头节点就是待删除的节点
Node temp = head;
head = head.next;
temp.next = null;
size--;
else
// 此时head一定不是待删除的节点
Node prev = head;
// 判断前驱的下一个节点值是否等于val
// 看你取值用的是哪个引用,就判断哪个引用不为空
while (prev.next!=null)
if (prev.next.val==val)
// cur就是待删除的节点
Node cur = prev.next;
// 删除cur
prev.next = cur.next;
cur.next = null;
size--;
return;
prev=prev.next; //prev不是待删除节点的前驱,prev向后移动
/**
* 删除单链表中所有val节点
* @param val
*/
public void removeValueAll(int val)
// 判断头节点是否是待删除节点
while (head!=null && head.val==val)
head=head.next;
size--;
if (head==null)
return;
else
Node prev = head;
while (prev.next!=null)
if (prev.next.val==val)
Node cur = prev.next;
prev.next=cur.next;
cur.next=null;
size--;
else
prev=prev.next;
/**
* 打印单链表
* @return
*/
public String toString()
String ret = "";
//遍历火车这个类
//从火车头 head 走到火车尾部
//暂存当前头节点位置
Node node = head;
while(node!=null)
ret += node.val;
ret += "->";
//继续访问下一节车厢
node = node.next;
ret += "NULL";
return ret;
/**
* 检验合法性 (修改,查找,删除时使用)
* @param index
* @return
*/
private boolean rangeCheck(int index)
if (index<0 || index >= size)
return false;
return true;
/**
* 火车车厢类,一个车厢只能保存一个元素
*/
class Node
int val; //存储具体数据
Node next; // 保存下一个车厢的地址
public Node(int val)
this.val=val;
测试类
package seqlist;
public class Test
public static void main(String[] args)
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.addFirst(1);
singleLinkedList.addFirst(3);
singleLinkedList.addFirst(5);
singleLinkedList.addLast(4);
System.out.println(singleLinkedList); //5->3->1->4->NULL
singleLinkedList.removeIndex(2);
System.out.println(singleLinkedList);//5->3->4->NULL
singleLinkedList.addFirst(1);
singleLinkedList.addFirst(3);
singleLinkedList.addFirst(5);
singleLinkedList.addLast(4);
System.out.println(singleLinkedList);//5->3->1->5->3->4->4->NULL
singleLinkedList.removeFirst();
System.out.println(singleLinkedList);//3->1->5->3->4->4->NULL
singleLinkedList.removeIndex(1);
System.out.println(singleLinkedList);//3->5->3->4->4->NULL
singleLinkedList.removeValueAll(4);
System.out.println(singleLinkedList);//3->5->3->NULL
singleLinkedList.removeValueOnce(3);
System.out.println(singleLinkedList);//5->3->NULL
源代码:
src/seqlist/SingleLinkedList.java · Wyuchan/javasjjg - Gitee.com
over~~
以上是关于Java单链表[增删改查]的主要内容,如果未能解决你的问题,请参考以下文章