第一天 Listnode

Posted on 2025-11-20 10:19  熊兔  阅读(2)  评论(0)    收藏  举报

    1. 编程前先用if将不合格的输入输出false

2.Listnode相关知识学习

链表的数据结构
/**
 * 单向链表节点结构体
 * 备注:这是链表最基本的数据结构,包含数据域和指针域
 */
struct ListNode {
    int val;        // 数据域:存储节点值
    ListNode *next; // 指针域:指向下一个节点
    
    // 默认构造函数
    ListNode() : val(0), next(nullptr) {}
    // 带值构造函数
    ListNode(int x) : val(x), next(nullptr) {}
    // 带值和下一个节点指针的构造函数
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};

/**
 * 双向链表节点结构体
 * 备注:相比单向链表,多了一个指向前驱节点的指针,可以双向遍历
 */
struct DoublyListNode {
    int val;
    DoublyListNode *prev; // 指向前一个节点
    DoublyListNode *next; // 指向下一个节点
    
    DoublyListNode() : val(0), prev(nullptr), next(nullptr) {}
    DoublyListNode(int x) : val(x), prev(nullptr), next(nullptr) {}
};
创建结点
// 创建三个节点的链表:1 -> 2 -> 3
ListNode* head = new ListNode(1);        // 第一个节点,值为1
head->next = new ListNode(2);           // 第二个节点,值为2  
head->next->next = new ListNode(3);     // 第三个节点,值为3

// 可视化表示:
// head → [val=1, next] → [val=2, next] → [val=3, next=nullptr]
创建链表
/**
 * 手动创建链表
 * 备注:适合创建固定的小链表,直观但扩展性差
 */
ListNode* createLinkedList() {
    ListNode* head = new ListNode(1);           // 创建头节点
    head->next = new ListNode(2);               // 创建第二个节点
    head->next->next = new ListNode(3);         // 创建第三个节点
    head->next->next->next = new ListNode(4);   // 创建第四个节点
    return head;
}


/**
 * 从整型数组动态建造链表
 */
ListNode* createFromArray(int arr[], int size) {
    if (size == 0) return nullptr;
    
    ListNode* head = new ListNode(arr[0]);
    ListNode* current = head;
    
    for (int i = 1; i < size; i++) {
        current->next = new ListNode(arr[i]);
        current = current->next;
    }
    
    return head;
}
void arrayExample() {
    int numbers[] = {1, 3, 5, 7, 9};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    
    ListNode* head = createFromArray(numbers, size);
    // 链表: 1->3->5->7->9
}

#include <vector>

/**
 * 从vector动态建造链表
 */
ListNode* createFromVector(const vector<int>& vec) {
    if (vec.empty()) return nullptr;
    
    ListNode* head = new ListNode(vec[0]);
    ListNode* current = head;
    
    for (size_t i = 1; i < vec.size(); i++) {
        current->next = new ListNode(vec[i]);
        current = current->next;
    }
    
    return head;
}
void vectorExample() {
    vector<int> data = {2, 4, 6, 8, 10};
    ListNode* head = createFromVector(data);
    // 链表: 2->4->6->8->10
}
三元运算:?
检查指针是否为空,再访问val
int n1 = l1 ? l1->val : 0;

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3