🔒文章目录:
1.❤️❤️前言~🥳🎉🎉🎉
2.ArrayList的缺陷
3.链表的概念及结构
注意:
1.从上图可看出,链式结构在逻辑上是连续的,但是在物理上不一定连续
2.其结点一般都是从堆上申请出来的
3.从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续
4.无头单向非循环链表的实现
4.1成员属性
public class SingleLinkedList {
static class ListNode{
public int value;
public ListNode next;
public ListNode(int value) {
this.value = value;
}
}
public ListNode head;
4.2成员方法
createList
display——打印链表
addFirst——头插
addLast——尾插
size——获取单链表长度
addIndex——在任意位置插入
contains——判定是否包含某个元素
remove——删除第一次出现关键字为key的结点
removeAll——删除所有值为key的结点
clear——清空单链表
4.3完整代码及使用
完整代码
public class SingleLinkedList {
static class ListNode{
public int value;
public ListNode next;
public ListNode(int value) {
this.value = value;
}
}
public ListNode head;
public void createList(){
ListNode listNode1 = new ListNode(45);
ListNode listNode2 = new ListNode(46);
ListNode listNode3 = new ListNode(50);
ListNode listNode4 = new ListNode(56);
ListNode listNode5 = new ListNode(67);
listNode1.next=listNode2;
listNode2.next=listNode3;
listNode3.next=listNode4;
listNode4.next=listNode5;
head=listNode1;
}
public void display(){
ListNode cur=head;
while(cur!=null){
System.out.print(cur.value+" ");
cur=cur.next;
}
System.out.println();
}
public int size(){
int count=0;
ListNode cur=head;
while(cur!=null){
cur=cur.next;
count++;
}
return count;
}
public void contain(int key){
ListNode cur=head;
while(cur!=null){
if(cur.value==key){
System.out.println(true);
return;
}
cur=cur.next;
}
System.out.println(false);
}
public void addFirst(int a){
ListNode listNode = new ListNode(a);
listNode.next=head;
head=listNode;
}
public void addLast(int a){
ListNode listNode = new ListNode(a);
ListNode cur=head;
if(head==null){
head=listNode;
return;
}
while(cur.next!=null){
cur=cur.next;
}
cur.next=listNode;
}
public void addIndex(int index,int a){
if(head==null){
ListNode listNode = new ListNode(a);
head=listNode;
return;
}
if(index<0||index>size()){
System.out.println("位置不合法");
//这里就不搞抛出异常了,我们简单点
return;
}
if(index==0){
addFirst(a);
return;
}
if(index==size()){
addLast(a);
return;
}
ListNode listNode = new ListNode(a);
ListNode cur=head;
for (int i = 0; i <index-1 ; i++) {
cur=cur.next;
}
listNode.next=cur.next;
cur.next=listNode;
}
public void remove(int key){
ListNode cur=head;
if(head==null) {
System.out.println("为空链表,不能进行删除操作");
return;
}
if(cur.value==key) {
head=head.next;
return;
}
while(cur.next!=null){
if(cur.next.value==key){
cur.next=cur.next.next;
return;
}
cur=cur.next;
}
System.out.println("不存在该数");
}
public void removeAll(int key){
if(this.head == null) {
System.out.println("为空链表,不能进行删除操作");
return;
}
ListNode cur = head;
while(cur.next != null){
if(cur.next.value == key){
cur.next=cur.next.next;
}
else {
cur = cur.next;
}}
if(head.value==key){
head = head.next;
}
}
public void clear(){
head=null;
}
}
完整代码的使用
public class Test {
public static void main(String[] args) {
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.createList();
singleLinkedList.display();
System.out.println(singleLinkedList.size());
singleLinkedList.contain(45);
singleLinkedList.addFirst(12);
singleLinkedList.addLast(67);
singleLinkedList.addIndex(3, 22);
singleLinkedList.display();
singleLinkedList.remove(22);
singleLinkedList.remove(12);
singleLinkedList.display();
singleLinkedList.removeAll(67);
singleLinkedList.display();
System.out.println("=======================");
singleLinkedList.clear();//清空该链表
singleLinkedList.display();
System.out.println("已清空该链表");
System.out.println("=======================");
}}