算法通关村第一关——链表青铜挑战笔记

1.理解Java/Python是如何构造出链表的

一般分为:普通的单链表带头结点的单链表双向循环链表

在工程应用,极少见到普通单链表,比较多的是带头结点的单链表和双向循环链表。 有时候会将多个链表组合从而实现更丰富的功能,这种操作在很多底层软件里大量使用,例如操作系统、虚拟机等。

1.1 链表的概念

  • 一个结点有且只能有一个后继
  • 一个结点可以被多次指向

1.1 普通的单链表

package com.okfang.ch1;

import lombok.Data;

@Data
public class ListNode {
    private int data;
    private ListNode next;
}

获取链表的长度

public void LinkListLength() {
    ListNode head = new ListNode(1);
    head.next(2).next(3).next(4).next(5);

    ListNode p = head;
    int length = 0;
    while (p != null) {
        p = p.getNext();
        length++;
    }
    System.out.println(length);
}

链表插入

public void LinkListInsert() {
    ListNode head = new ListNode(1);
    head.next(2).next(3).next(4).next(5);

    // 在 3 后面插入100
    ListNode node100 = new ListNode(100);

    ListNode p = head;
    while (p != null) {
        if (p.getData() == 3) {
            node100.setNext(p.getNext());
            p.setNext(node100);
            break;
        }
        p = p.getNext();
    }

    p = head;
    while (p != null) {
        System.out.println(p.getData());
        p = p.getNext();
    }
}

链表删除

public void LinkListRemove() {
    ListNode head = new ListNode(1);
    head.next(2).next(3).next(4).next(5);

    // 删除 3
    ListNode p = head;
    int targetVal = 3;
    if (p.getData() == targetVal) {
        head = p.getNext();
    } else {
        while (p != null) {
            if (p.getNext().getData() == targetVal) {
                p.setNext(p.getNext().getNext());
                break;
            }
            p = p.getNext();
        }
    }


    p = head;
    while (p != null) {
        System.out.println(p.getData());
        p = p.getNext();
    }
}

2.链表增加元素,首部、中间和尾部分别会有什么问题,该如何处理?
3.链表删除元素,首部、中间和尾部分别会有什么问题,该如何处理?
4.双向链表是如何构造的,如何实现元素的插入和删除。

你可能感兴趣的:(备战秋招!,算法,链表,笔记)