class ListNode{
public int val;
public ListNode next;
public ListNode(){
}
public ListNode(int val){
this.val = val;
}
}
public class MyLinkedList {
public ListNode head;
//得到单链表的长度
public int size(){
ListNode cur = this.head;
int count = 0;
while(cur != null){
count++;
cur = cur.next;
}
return count;
}
//查找是否包含关键字key是否在单链表
public boolean contains(int key){
ListNode cur = this.head;
while(cur != null){
if(cur.val == key){
return true;
}
cur = cur.next;
}
return false;
}
//头插法
public void addFirst(int data){
ListNode listNode = new ListNode(data);
listNode.next = this.head;
this.head = listNode;
}
//打印链表
public void display(){
ListNode cur = this.head;
while(cur != null){
System.out.print(cur.val + " ");
cur = cur.next;
}
System.out.println();
}
//尾插法
public void addLast(int data){
ListNode listNode = new ListNode(data);
if(this.head == null){
this.head = listNode;
}else{
ListNode cur = this.head;
while(cur.next != null){
cur = cur.next;
}
cur.next = listNode;
}
}
//查找index位置的前一位
public ListNode searchPrev(int index){
int count = 0;
ListNode cur = this.head;
while(count != index-1){
cur = cur.next;
count++;
}
return cur;
}
//任意位置插入,第一个数据节点为0号下标
public void addIndex(int index,int data){
if(index < 0 || index > size()){
throw new RuntimeException("插入位置不合法");
}else if(index == 0){
//头插法
addFirst(data);
}else if(index == size()){
//尾插法
addLast(data);
}else{
ListNode cur = searchPrev(index);
ListNode listNode = new ListNode(data);
listNode.next = cur.next;
cur.next = listNode;
}
}
//查找第一次出现的关键字前驱节点
public ListNode searchPreNode(int val){
ListNode cur = this.head;
while(cur.next != null){
if(cur.next.val == val){
return cur;
}
cur = cur.next;
}
return null;
}
//删除第一次出现关键字key的节点
public void remove(int val){
//单独判断头节点问题
if(this.head.val == val){
this.head = this.head.next;
return;
}
ListNode cur = searchPreNode(val);
if(cur == null){
System.out.println("找不到关键字");
return;
}
ListNode del = cur.next;
cur.next = del.next;
}
//删除所有值为key的节点
public void removeAllKey(int val){
//1.判断头节点是否为空
if(this.head == null){
return;
}
//2.删除头节点以外的key的节点
ListNode prev = this.head;
ListNode cur = this.head.next;
while(cur != null){
if(cur.val == val){
prev.next = cur.next;
cur = cur.next;
}else{
prev = cur;
cur = cur.next;
}
}
//3.判断头节点
if(this.head.val == val){
this.head = this.head.next;
}
}
}
Java实现单向无头链表
最新推荐文章于 2024-08-01 15:05:06 发布