解题思路

  1. 插入操作

    • 创建一个新节点。
    • 如果链表为空,直接将新节点作为头节点。
    • 遍历链表,找到第一个值为 x 的节点,在其前插入新节点。
    • 如果没有找到 x,将新节点插入到链表末尾。
  2. 删除操作

    • 如果链表为空,直接返回。
    • 如果头节点的值为 x,直接删除头节点。
    • 遍历链表,找到第一个值为 x 的节点,删除该节点。
  3. 输出链表

    • 遍历链表输出每个节点的值。
    • 如果链表为空,输出 "NULL"。

代码

#include <iostream>
#include <string>
using namespace std;

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};

class LinkedList {
private:
    ListNode* head;

public:
    LinkedList() : head(nullptr) {}

    void insert(int x, int y) {
        ListNode* newNode = new ListNode(y);
        if (!head) {
            head = newNode;
            return;
        }

        if (head->val == x) {
            newNode->next = head;
            head = newNode;
            return;
        }

        ListNode* prev = nullptr;
        ListNode* curr = head;
        while (curr && curr->val != x) {
            prev = curr;
            curr = curr->next;
        }

        if (prev) {
            newNode->next = prev->next;
            prev->next = newNode;
        } else {
            newNode->next = head;
            head = newNode;
        }
    }

    void deleteNode(int x) {
        if (!head) return;

        if (head->val == x) {
            ListNode* temp = head;
            head = head->next;
            delete temp;
            return;
        }

        ListNode* prev = nullptr;
        ListNode* curr = head;
        while (curr && curr->val != x) {
            prev = curr;
            curr = curr->next;
        }

        if (curr) {
            prev->next = curr->next;
            delete curr;
        }
    }

    void printList() {
        if (!head) {
            cout << "NULL" << endl;
            return;
        }

        ListNode* curr = head;
        while (curr) {
            cout << curr->val << " ";
            curr = curr->next;
        }
        cout << endl;
    }
};

int main() {
    int n;
    cin >> n;
    LinkedList list;

    string op;
    while (n--) {
        cin >> op;
        if (op == "insert") {
            int x, y;
            cin >> x >> y;
            list.insert(x, y);
        } else if (op == "delete") {
            int x;
            cin >> x;
            list.deleteNode(x);
        }
    }

    list.printList();
    return 0;
}
import java.util.Scanner;

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

class LinkedList {
    private ListNode head;

    public LinkedList() {
        head = null;
    }

    public void insert(int x, int y) {
        ListNode newNode = new ListNode(y);
        if (head == null) {
            head = newNode;
            return;
        }

        if (head.val == x) {
            newNode.next = head;
            head = newNode;
            return;
        }

        ListNode prev = null;
        ListNode curr = head;
        while (curr != null && curr.val != x) {
            prev = curr;
            curr = curr.next;
        }

        if (prev != null) {
            newNode.next = prev.next;
            prev.next = newNode;
        } else {
            newNode.next = head;
            head = newNode;
        }
    }

    public void deleteNode(int x) {
        if (head == null) return;

        if (head.val == x) {
            head = head.next;
            return;
        }

        ListNode prev = null;
        ListNode curr = head;
        while (curr != null && curr.val != x) {
            prev = curr;
            curr = curr.next;
        }

        if (curr != null) {
            prev.next = curr.next;
        }
    }

    public void printList() {
        if (head == null) {
            System.out.println("NULL");
            return;
        }

        ListNode curr = head;
        while (curr != null) {
            System.out.print(curr.val + " ");
            curr = curr.next;
        }
        System.out.println();
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        LinkedList list = new LinkedList();

        for (int i = 0; i < n; i++) {
            String op = sc.next();
            if (op.equals("insert")) {
                int x = sc.nextInt();
                int y = sc.nextInt();
                list.insert(x, y);
            } else if (op.equals("delete")) {
                int x = sc.nextInt();
                list.deleteNode(x);
            }
        }

        list.printList();
    }
}
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None

    def insert(self, x, y):
        new_node = ListNode(y)
        if not self.head:
            self.head = new_node
            return

        if self.head.val == x:
            new_node.next = self.head
            self.head = new_node
            return

        prev = None
        curr = self.head
        while curr and curr.val != x:
            prev = curr
            curr = curr.next

        if prev:
            new_node.next = prev.next
            prev.next = new_node
        else:
            new_node.next = self.head
            self.head = new_node

    def delete(self, x):
        if not self.head:
            return

        if self.head.val == x:
            self.head = self.head.next
            return

        prev = None
        curr = self.head
        while curr and curr.val != x:
            prev = curr
            curr = curr.next

        if curr:
            prev.next = curr.next

    def print_list(self):
        if not self.head:
            print("NULL")
            return

        curr = self.head
        while curr:
            print(curr.val, end=" ")
            curr = curr.next
        print()

# 读取输入
n = int(input())
linked_list = LinkedList()

for _ in range(n):
    op = input().strip().split()
    if op[0] == "insert":
        x, y = int(op[1]), int(op[2])
        linked_list.insert(x, y)
    elif op[0] == "delete":
        x = int(op[1])
        linked_list.delete(x)

linked_list.print_list()

算法及复杂度分析

算法:

  • 链表的基本操作

时间复杂度:

  • 插入操作(insert):

    • 需要遍历链表找到插入位置
    • 最坏情况下需要遍历整个链表
  • 删除操作(delete):

    • 需要遍历链表找到要删除的节点
    • 最坏情况下需要遍历整个链表
  • 打印操作(print_list):

    • 需要遍历整个链表输出所有节点
  • 总体时间复杂度:

    • 是操作次数
    • 是链表长度
    • 每个操作最坏情况下都需要遍历整个链表

空间复杂度:

  • 链表存储:

    • 是链表的节点数
    • 每个节点需要存储值和指针
  • 其他变量:

    • 只需要少量额外变量来处理操作
  • 总体空间复杂度:

    • 主要由链表本身的存储空间决定