目录
定义火车类
/**
* 火车类
*/
public class SingleLinkedList {
//实际火车中的车厢个数
private int size;
//火车的头节点
private Node head;
}
定义车厢类
/**
* 车厢类
*/
class Node{
//存储具体的数据
int val;
//保存下一节车厢的地址
Node next;
public Node(int val) {
this.val = val;
}
}
增
-
头插法
/**
* 在火车头部插入元素
* @param val
*/
public void addFirst(int val){
Node node = new Node(val);
//判断火车头节点是否为空
if(head == null){
head = node;
}
else{
node.next = head;
head = node;
}
size++;
}
-
根据索引插入
/**
* 根据索引插入
* @param index
* @param val
*/
public void addIndex(int index,int val) {
if (index < 0 || index > size) {
System.out.println("索引输入错误!");
} else {
if (index == 0) {
addFirst(val);
return;
}
Node node = new Node(val);
Node pre = head;
for (int i = 0; i < index - 1; i++) {
pre = pre.next;
}
node.next = pre.next;
pre.next = node;
size++;
}
}
-
尾插法
/**
* 尾插法
* @param val
*/
public void addLast(int val){
addIndex(size,val);
}
-
测试
/**
* @author happy
*/
public class Test {
public static void main(String[] args) {
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.addFirst(1);
singleLinkedList.addFirst(3);
singleLinkedList.addFirst(5);
//5->3->1->NULL
System.out.println(singleLinkedList);
singleLinkedList.addIndex(0,2);
singleLinkedList.addIndex(2,6);
singleLinkedList.addIndex(4,8);
//2->5->6->3->1->NULL
System.out.println(singleLinkedList);
singleLinkedList.addLast(7);
//2->5->6->3->8->1->7->NULL
System.out.println(singleLinkedList);
}
}
查
-
根据index查找
/**
* 根据用户输入的index查找对应值
* @param index
* @return
*/
public int get(int index){
if(indexCheck(index)){
Node node = head;
for (int i = 0; i <index ; i++) {
node = node.next;
}
return node.val;
}else {
System.out.println("索引输入错误!");
return -1;
}
}
-
根据val查找
/**
* 判断当前链表中是否包含值为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;
}
-
测试
/**
* @author happy
*/
public class Test {
public static void main(String[] args) {
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.addFirst(1);
singleLinkedList.addFirst(3);
singleLinkedList.addFirst(5);
//5->3->1->NULL
System.out.println(singleLinkedList);
singleLinkedList.addIndex(0,2);
singleLinkedList.addIndex(2,6);
singleLinkedList.addIndex(4,8);
//2->5->6->3->1->NULL
System.out.println(singleLinkedList);
singleLinkedList.addLast(7);
//2->5->6->3->8->1->7->NULL
System.out.println(singleLinkedList);
//2
System.out.println(singleLinkedList.get(0));
//true
System.out.println(singleLinkedList.contains(8));
}
}
改
-
根据index修改
/**
* 将单链表中索引为index的节点值改为newVal
* @param index
* @param newVal
* @return
*/
public int set(int index,int newVal){
Node node = head;
if (indexCheck(index)){
for (int i = 0; i < index; i++) {
node = node.next;
}
int oldVal = node.val;
node.val = newVal;
return oldVal;
}else {
System.out.println("索引输入错误!");
return -1;
}
}
-
测试
/**
* @author happy
*/
public class Test {
public static void main(String[] args) {
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.addFirst(1);
singleLinkedList.addFirst(3);
singleLinkedList.addFirst(5);
//5->3->1->NULL
System.out.println(singleLinkedList);
singleLinkedList.addIndex(0,2);
singleLinkedList.addIndex(2,6);
singleLinkedList.addIndex(4,8);
//2->5->6->3->1->NULL
System.out.println(singleLinkedList);
singleLinkedList.addLast(7);
//2->5->6->3->8->1->7->NULL
System.out.println(singleLinkedList);
//2
System.out.println(singleLinkedList.get(0));
//true
System.out.println(singleLinkedList.contains(8));
singleLinkedList.set(0,1);
singleLinkedList.set(3,9);
singleLinkedList.set(6,10);
//1->5->6->9->8->1->10->NULL
System.out.println(singleLinkedList);
}
}
删
-
根据索引删除
/**
* 根据索引删除
* @param index
*/
public void removeIndex(int index){
if (indexCheck(index)){
if(index == 0){
Node node = head;
head = head.next;
node.next = null;
size--;
}else {
Node pre = head;
for (int i = 0; i < index-1; i++) {
pre = pre.next;
}
//cur是待删除节点
Node cur = pre.next;
pre.next = cur.next;
cur.next = null;
size--;
}
}else {
System.out.println("索引输入错误!");
}
}
-
删除头节点
public void removeFirst(){
removeIndex(0);
}
-
删除尾节点
public void removeLast(){
removeIndex(size-1);
}
-
测试
/**
* @author happy
*/
public class Test {
public static void main(String[] args) {
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.addFirst(1);
singleLinkedList.addFirst(3);
singleLinkedList.addFirst(5);
//5->3->1->NULL
System.out.println(singleLinkedList);
singleLinkedList.addIndex(0,2);
singleLinkedList.addIndex(2,6);
singleLinkedList.addIndex(4,8);
//2->5->6->3->1->NULL
System.out.println(singleLinkedList);
singleLinkedList.addLast(7);
//2->5->6->3->8->1->7->NULL
System.out.println(singleLinkedList);
//2
System.out.println(singleLinkedList.get(0));
//true
System.out.println(singleLinkedList.contains(8));
singleLinkedList.set(0,1);
singleLinkedList.set(3,9);
singleLinkedList.set(6,10);
//1->5->6->9->8->1->10->NULL
System.out.println(singleLinkedList);
singleLinkedList.removeFirst();
singleLinkedList.removeLast();
//5->6->9->8->1->NULL
System.out.println(singleLinkedList);
singleLinkedList.removeIndex(0);
singleLinkedList.removeIndex(2);
singleLinkedList.removeIndex(2);
//6->9->NULL
System.out.println(singleLinkedList);
}
}
判断索引是否合法
public boolean indexCheck(int index){
if (index<0 ||index>=size) {
return false;
}
return true;
}
toString()方法
public String toString(){
String ret = "";
Node node = head;
while (node != null){
ret += node.val;
ret += "->";
node = node.next;
}
ret += "NULL";
return ret;
}
}
全部代码
package daily_practice.day_11_27.seq;
/**
* @author happy
*/
/**
* 火车类
*/
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++;
}
/**
* 根据索引插入
* @param index
* @param val
*/
public void addIndex(int index,int val) {
if (index < 0 || index > size) {
System.out.println("索引输入错误!");
} else {
if (index == 0) {
addFirst(val);
return;
}
Node node = new Node(val);
Node pre = head;
for (int i = 0; i < index - 1; i++) {
pre = pre.next;
}
node.next = pre.next;
pre.next = node;
size++;
}
}
/**
* 尾插法
* @param val
*/
public void addLast(int val){
addIndex(size,val);
//出错,空指针异常
// Node node = new Node(val);
// if(head == null){
// addFirst(val);
// }
// Node pre = head;
// while (pre != null){
// pre = pre.next;
// }
// pre.next = node;
// size++;
}
/**
* 根据用户输入的index查找对应值
* @param index
* @return
*/
public int get(int index){
if(indexCheck(index)){
Node node = head;
for (int i = 0; i <index ; i++) {
node = node.next;
}
return node.val;
}else {
System.out.println("索引输入错误!");
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){
Node node = head;
if (indexCheck(index)){
for (int i = 0; i < index; i++) {
node = node.next;
}
int oldVal = node.val;
node.val = newVal;
return oldVal;
}else {
System.out.println("索引输入错误!");
return -1;
}
}
public void removeFirst(){
removeIndex(0);
}
/**
* 根据索引删除
* @param index
*/
public void removeIndex(int index){
if (indexCheck(index)){
if(index == 0){
Node node = head;
head = head.next;
node.next = null;
size--;
}else {
Node pre = head;
for (int i = 0; i < index-1; i++) {
pre = pre.next;
}
//cur是待删除节点
Node cur = pre.next;
pre.next = cur.next;
cur.next = null;
size--;
}
}else {
System.out.println("索引输入错误!");
}
}
public void removeLast(){
removeIndex(size-1);
}
public boolean indexCheck(int index){
if (index<0 ||index>=size) {
return false;
}
return true;
}
public String toString(){
String ret = "";
Node node = head;
while (node != null){
ret += node.val;
ret += "->";
node = node.next;
}
ret += "NULL";
return ret;
}
}
/**
* 车厢类
*/
class Node{
//存储具体的数据
int val;
//保存下一节车厢的地址
Node next;
public Node(int val) {
this.val = val;
}
}