Java学习总结——链表相关知识

1、链表的简单实现:

Node类(链表节点):

class Node {
    int data; // 数据
    Node next; // 下一节点

    Node (int data) {
        this.data = data;
        this.next = null;
    }
}

LinkedList类(链表):

class LinkedList {
    Node head;

    // 添加节点到链表末尾
    void append(int data) {
        Node newNode = new Node(data);
        if (head == null) {  // 判断是否有链表头
            head = newNode;
            return;
        }
        Node last = head;
        while (last.next != null) { // 判断是否到了链表尾
            last = last.next;
        }
        last.next = newNode;
    }

    // 遍历并打印链表
    void printList() {
        Node temp = head;
        while (temp != null) {
            System.out.print(temp.data + " ");
            temp = temp.next;
        }
        System.out.println();
    }

    // 在链表开头插入节点
    void insertAtStart(int data) {
        Node newNode = new Node(data);
        newNode.next = head;
        head = newNode;
    }

    // 删除链表中的节点
    void deleteNode(int key) {
        if (head == null) { // 判断是否为空链表
            return;
        }
        if (head.data == key) { // 判断表头是否为指定节点
            head = head.next;
            return;
        }
        Node temp = head;
        while (temp.next != null) {
            if (temp.next.data == key) {
                temp.next = temp.next.next;
                return;
            }
            temp = temp.next;
        }
    }
}

测试结果:

public class Main {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        linkedList.append(1);
        linkedList.append(2);
        linkedList.append(3);
        linkedList.append(4);
        linkedList.printList(); // 输出: 1 2 3 4 

        linkedList.insertAtStart(0);
        linkedList.printList(); // 输出: 0 1 2 3 4 

        linkedList.deleteNode(2);
        linkedList.printList(); // 输出: 0 1 3 4 
    }
}

2、在Java面试中,关于链表的题目通常涉及:链表的基本操作、结构理解、性能分析以及算法实现等。

  • 链表反转

给定一个单向链表的头节点,要求将其反转,并返回新的头节点

解题思路:使用三个指针precurnext来遍历链表,将curnext指向pre,然后移动指针,直到遍历完整个链表。

  • 链表中环的检测

给定一个单向链表的头节点,判断链表中是否存在环

解题思路:使用快慢指针的方法,快指针每次移动两个节点,慢指针每次移动一个节点,若存在环,则快指针最终会追上慢指针;若不存在环,则快指针会先到达链表尾部。

  • 链表的中间节点

给定一个单向链表的头节点,找到链表的中间节点:

解题思路:使用快慢指针,快指针每次移动两个节点,慢指针每次移动一个节点,当快指针到达链表尾部时,慢指针指向链表的中间节点。指针从表头出发,如果节点数为偶数,则慢指针会指向中间两个节点中靠后的一个节点。

  • 链表中倒数第k个节点

给定一个单向链表的头节点和整数k,找到链表中倒数第k个节点:

解题思路:创建两个指针fastslow,均指向头节点。先让fast走k-1步,然后slowfast一起每次走一步,当fast走完时,slow就指向倒数第k个节点。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值