完成一个编程,实现无头单项非循环链表。
具体实现以下操作:
//头插法
public void addFirst(int data);
//尾插法
public void addLast(int data);
//任意位置插入,第一个数据节点为0号下标
public boolean addIndex(int index,int data);
//查找是否包含关键字key是否在单链表当中
public boolean contains(int key);
//删除第一次出现关键字为key的节点
public void remove(int key);
//删除所有值为key的节点
public void removeAllKey(int key);
//得到单链表的长度
public int size();
public void toString();
public void clear();
具体代码实现:
import java.util.LinkedList;
import java.util.List;
class Node{
public int val;
public Node next;//类型是node
public Node(int val){
this.val=val;
}
}
public class LinkList {
public Node head;
public int usedSize;//记录当前链表节点的个数
public void createList(){
Node node1=new Node(12);
Node node2=new Node(23);
Node node3=new Node(30);
Node node4=new Node(54);
node1.next=node2; //类似于int a=10;
node2.next=node3;
node3.next=node4;
this.head=node1;
this.usedSize=4;
}
//输出数据
public void myToString(){
Node cur=this.head;
while(cur!=null ){
System.out.println(cur.val+"");
cur=cur.next;
}
}
//查找是否包含关键字key是否在单链表当中
public boolean contains(int key){
Node cur=this.head;
while(cur!=null){
if(cur.val==key){
return true;
}
cur=cur.next;
}
return false;
}
//得到单链表的长度
public int size(){
return this.usedSize;
}
//头插法
public void addFirst(int data) {
Node node=new Node(data);
if(head==null){
head=node;
}else{
node.next=head;
head=node;
}
this.usedSize++;
}
//尾插法
public void addLast(int data){
Node node=new Node(data);
if(this.head==null){
this.head=node;
}else{
Node cur=this.head;
while(cur.next!=null){
cur=cur.next;
}
cur.next=node;
}
this.usedSize++;
}
private Node searchIndex(int index) {
int count = 0;
Node 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>this.usedSize){
throw new RuntimeException("index不合法");
}
if(index==0){
addFirst(data);
return;
}
if(index==this.usedSize){
addLast(data);
return;
}
searchIndex(index);
Node node=new Node(data);
Node cur=searchIndex(index);
node.next=cur.next;
cur.next=node;
this.usedSize++;
}
//删除第一次出现关键字为key的节点
public void remove(int key){
if(this.head==null){
return;
}
if(this.head.val==key){
this.head=this.head.next;
return;
}
Node prev=findPrevNode(key);
if(prev==null){
throw new RuntimeException("不存在删除的节点");
}
Node del=prev.next;
prev.next=del.next;
}
//找到关键字key的前一个节点
private Node findPrevNode(int key){
Node prev=this.head;
while(prev.next!=null){
if(prev.next.val==key){
return prev;
}
prev=prev.next;
}
return null;
}
//删除所有值为key的节点
public void removeAllKey(int key){
if(this.head==null)return;
Node prev=this.head;
Node cur=this.head.next;
while(cur!=null){
if(cur.val==key){
prev.next=cur.next;
cur=cur.next;
this.usedSize--;
}else{
prev=cur;
cur=cur.next;
}
}
if(this.head.val==key){
this.head=this.head.next;
this.usedSize--;
}
}
//清空
public void clear(){
this.usedSize = 0;
}
}
主函数代码(部分):
public class Test {
public static void main(String[] args) {
LinkList linkList=new LinkList();
linkList.createList();
linkList.myToString();
linkList.addLast(4);
linkList.addFirst(1);
linkList.addIndex(4,1);
}
}