1. 链表的基本概念及创建

链表基本概念:
1.在一条链表中,元素和元素之间有相对顺序,链表也是有头有尾的
2.与之前学过的顺序表不同的点在于链表在逻辑上有序,但是不保证在物理(存储)过程中满足逻辑上的次序
3.链表中的结点类(Node):可以把结点看做一个盒子,盒子里装有结点的值,还有指向下一个节点的线索(next)

public class Node {
   public int val;//保存结点的值
   public Node next;//保存指向下一个结点的引用
}

4.在一条链表中,头结点是最重要的,找到头结点就可以找到链表中的其他元素,所以一般用头结点来代表一条完整的链表

Node head = ...;//头结点的定义

Node head = null;
头结点为null,表示该结点不存在,也就是说这是一条空链表

Java获取链表的倒数第m个元素 java链表怎么遍历_结点


指定头结点的代码:

Node head = n1;//让head的引用指向n1引用指向的对象

在上图中:
cur:指的是当前结点,也就是说表示的是链表中的某个结点
pre:指的是前驱结点,表示链表中某个结点的前一个结点(头结点没有前驱结点)
next:指的是后继结点,表示链表中某个结点的前一个结点(尾结点没有后继结点)
链表的创建:
代码:

//创建了一个顺序为[1,3,2,6]的链表
        Node n1 = new Node();
        Node n3 = new Node();
        Node n2 = new Node();
        Node n6 = new Node();

        n1.val = 1;
        n3.val = 3;
        n2.val = 2;
        n6.val = 6;

        n1.next = n3;//用到后继结点,可以形成一个完整的链表
        n3.next = n2;
        n2.next = n6;
        n6.next = null;//尾结点的后继结点一般为null

        Node head = n1;//确定头结点 head和n1指向同一个对象

2. 链表的遍历

实现链表的遍历只需要打印链表中的每一个元素
代码实现遍历链表[1, 3,2, 6]并打印链表的每个元素:

Node cur = head;//让cur(当前结点)指向head指向的对象
        while ( cur != null){
            System.out.println(cur.val);//输出目前cur的值
            cur = cur.next;//让cur指向cur.next目前指向的对象
        }

图示如下:

Java获取链表的倒数第m个元素 java链表怎么遍历_java_02

3.链表遍历练习

1.通过遍历找到链表的最后一个结点:

//方法一:
        Node cur = head;//让cur2指向head指向的对象
        while(cur != null && cur.next != null){
            cur = cur.next;
        }
        //如果cur.next为null的话,就是最后一个结点
        System.out.println(cur.val);//6

        //方法二:(暂时不考虑链表为空的情况)
        Node last = head;//让last指向head指向的对象
        while(last.next != null){//遍历
            last = last.next;
        }
        //last.next为null的话直接跳出循环,打印尾结点的值
        System.out.println(last.val);//6

2.通过遍历,计算链表中元素的个数:

int count = 0;//定义一个count,记录遍历次数
        Node cur1 = head;//让cur(当前结点)指向head指向的对象
        while ( cur1 != null){
            System.out.println(cur1.val);//输出目前cur的值
            cur1 = cur1.next;//让cur指向cur.next目前指向的对象
            count++;//每遍历一次,都让count++
        }
        System.out.println("链表中元素个数:" + count);//4

3.通过遍历,找到链表的倒数第二个结点:
要点:定义一个secondLast而后进行遍历,
如果secondLast.next.next == null就证明secondLast是我们要找的倒数第二个结点

Node secondLast = head;//让secondLast指向head指向的对象
        while (secondLast.next.next != null){
        //当secondLast.next.next为空时,就代表找到了倒数第二个结点
            secondLast = secondLast.next;
        }
        System.out.println(secondLast.val);//2

4.通过遍历,找到链表的第n个结点(链表长度>=n)

int n = 2;  //表示要找的是第二个结点
        Node nCur = head;
        for (int i = 1; i < n; i++) {//每循环一次就向后走一步
            nCur = nCur.next;//一共需要走n-1步
        }
        System.out.println(nCur.val);//3

5.通过遍历,找到链表中是否包含某个元素:

boolean isFound = false;//定义一个判断函数
        int target = 3;     //要找的元素
        cur = head;
        while(cur != null){
            if(cur.val == target){
            //在遍历中判断现在遍历到的元素是否是要找的元素target
                isFound = true;
            }
            cur  = cur.next;
        }
        System.out.println(isFound);//true