单向不带头非循环链表实现
class ListNode{
public int val;
public ListNode next;
public ListNode(int val){
this.val=val;
}
}
public ListNode head;
遍历链表
//遍历链表
public void show(){
//这里不是定义了一个节点,这里只是引用
ListNode cur=head;
while(cur!=null){
System.out.println(cur.val+"");
cur=cur.next;
}
}
头插法
//头插法
public void addFirst(int data){
//让新的node成为新的头节点
ListNode node=new ListNode(data);
node.next=head;
head=node;
}
尾插法
//尾插法
public void addLast(int data){
ListNode node=new ListNode(data);
if(head==null){
head=node;
return;
}
ListNode cur=head;
while(cur.next!=null){
cur=cur.next;
}
cur.next=node;
}
任意位置插入
//任意位置插入
public void add(int index,int data){
ListNode node=new ListNode(data);
//判断index位置合法性
if(index>size()||index<0){
throw new IndexOutOfBounds("index位置不合法\n");
}
if(index==0){
addFirst(data);//头插
return;
}
if (index==size()){
addLast(data);//尾插
return;
}
//找到index-1节点位置
ListNode cur=findIndex(index);
// 插入
node.next=cur.next;
cur.next=node;
}
private ListNode findIndex(int index){
ListNode cur=head;
while(index-1!=0){
cur=cur.next;
index--;
}
return cur;//index-1的节点
}
得到单链表长度,链表中的节点个数
//得到单链表长度,链表中的节点个数
public int size(){
ListNode cur=head;
int count=0;
while(cur!=null){
count++;
cur=cur.next;
}
return count;
}
查找是否包含关键字key在链表中
//查找是否包含关键字key在链表中
public boolean contains(int key){
ListNode cur=head;
while (cur!=null){
if(key== cur.val){
return true;
}
cur=cur.next;
}
return false;
}
删除第一次出现关键字为key的节点
//删除第一次出现关键字为key的节点
public void remove(int key){
ListNode prev=searchPrev(key);
if(prev==null){
System.out.printf("没有你要删除的数字\n");
return;
}
ListNode del=prev.next;//要删除节点
prev.next=del.next;
}
private ListNode searchPrev(int key){//寻找key的前驱
ListNode prev=head;
while(prev.next!=null){
if(prev.next.val==key){
return prev;
}else {
prev=prev.next;
}
}
return prev;
}