线性表-链表1(Java)

文章目录

  • 1.链表的原理
    • 1.1链表的示意图
    • 1.2链表的表现形式
    • 1.3结点的分类
  • 2.链表的代码表示
    • 2.1链表的结点定义
    • 2.2链表的手工创建
      • 2.2.1创建一个[1 3 5 6]的链表
      • 2.2.2创建一个空链表
    • 2.3遍历链表
      • 2.3.1链表不知道长度的情况,打印链表的元素
      • 2.3.2通过遍历,打印链表的最后一个元素
      • 2.3.3打印链表的倒数第二个元素
      • 2.3.4打印链表的第n个结点(n>链表的长度)
      • 2.3.5计算出链表中元素的个数
      • 2.3.6找到链表中是否包含某个元素

1.链表的原理

1.1链表的示意图

线性表-链表1(Java)_第1张图片
元素:真实存于线性表中的内容,是我们一般核心关注的内容。
结点(node);为了组织链表而引入的一个结构,除了保存我们的元素之外,还会保存指向下一个结点的引用。

1.2链表的表现形式

public class Node {
    public int val;
    public Node next;
    
    public Node(int val){
        this.val=val;
    }
}

链表:最终的线性表,表示逻辑上的[1 3 2 6]
目前,我们通过链表的头节点,来代替一整条链表。

//head是一条链表的头结点;通过head我们可以找到找到所有的结点;所以用头节点来代替链表
Node head=...;
//某链表的头节点是null;表示头节点不存在,进一步可以表示一条没有头节点的链表,也就是一条空链表。
Node head=null;

1.3结点的分类

线性表-链表1(Java)_第2张图片
当前结点(current/cur):表示链表中某个结点
前驱节点(previous/prev):表示链表中的某个结点的前一个结点;头节点没有前驱节点。
后继节点(next):表示链表中的某个结点的后一个结点;尾结点没有后继节点。

2.链表的代码表示

2.1链表的结点定义

public class Node {
    public int val;
    public Node next;

    public Node(int val){
        this.val=val;
        this.next=null;
    }
    
    @Override
    public String toString(){
        return "Node{"+val+"}";
    }
}

2.2链表的手工创建

2.2.1创建一个[1 3 5 6]的链表

public class myListNode {
    public static Node createList(){
        Node a=new Node(1);
        Node b=new Node(3);
        Node c=new Node(5);
        Node d=new Node(6);
        
        a.next=b;
        b.next=c;
        c.next=d;
        d.next=null;
        return a;
    }
}

2.2.2创建一个空链表

Node head=null;

2.3遍历链表

2.3.1链表不知道长度的情况,打印链表的元素

public static void main(String[] args) {
        Node head=createList();
        Node cur=head;
        while(cur!=null){
            System.out.print(cur.val+" ");
            cur=cur.next;
        }
    }

2.3.2通过遍历,打印链表的最后一个元素

public static void main(String[] args) {
     
        Node head=createList();
        Node cur=head;
        while(cur.next!=null){
     
            cur=cur.next;
        }
        System.out.println(cur.val);
    }

2.3.3打印链表的倒数第二个元素

public static void main(String[] args) {
     
        Node head=createList();
        Node cur=head;
        while(cur.next.next!=null){
     
            cur=cur.next;
        }
        System.out.println(cur.val);
    }

2.3.4打印链表的第n个结点(n>链表的长度)

public static void main(String[] args) {
     
        Node head=createList();
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入一个小于链表长度的整数");
        int n=scanner.nextInt();
        Node cur=head;
        int i=0;
        for(;i<n;i++){
     
            cur=cur.next;
        }
        System.out.println(cur.val);
    }

2.3.5计算出链表中元素的个数

public static void main(String[] args) {
     
        Node head=createList();
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入一个小于链表长度的整数");
        int n=scanner.nextInt();
        Node cur=head;
        int i=0;
        for(;i<n;i++){
     
            cur=cur.next;
        }
        System.out.println(cur.val);
    }

2.3.6找到链表中是否包含某个元素

public static boolean isElement(Node head,int x){
     
        if(head==null){
     
            return false;
        }
        for(Node cur=head;cur!=null;cur=cur.next){
     
            if(cur.val==x){
     
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
     
        Node head=createList();
        System.out.println(isElement(head,3));
    }

你可能感兴趣的:(数据结构,链表,数据结构,java)