数据结构------链表OJ

链表是一种常见的数据结构,在算法和数据结构中占据着重要的地位。它由一系列节点组成首先,我们定义一个简单的链表节点结构:,每个节点包含数据和指向下一个节点的指针。链表有很多种类型,比如单向链表、双向链表和循环链表等。在本文中,我们将以单向链表为例,介绍链表的基本操作和应用场景。

链表的基本操作包括插入、删除、查找和遍历。下面我们将分别介绍这些操作的实现方法。

插入操作: 链表的插入操作可以分为在头部插入、在尾部插入和在中间插入三种情况。在单向链表中,它们的实现方法如下:

首先,我们定义一个简单的链表节点结构:

class ListNode:
    def __init__(self, value=0, next=None):
        self.value = value
        self.next = next

在头部插入:新节点的指针指向原来的头节点,将新节点设置为头节点即可。 在尾部插入:遍历链表找到尾节点,将尾节点的指针指向新节点,将新节点设置为尾节点即可。 在中间插入:遍历链表找到插入位置的前一个节点,将新节点的指针指向插入位置的后一个节点,将插入位置的前一个节点的指针指向新节点即可。

接下来,我们来演示链表的插入操作。假设我们有一个链表 1 -> 2 -> 3,现在要在中间插入一个值为 4 的节点,位置为第二个节点后面。下面是代码实现: 

def insert_node(head, pos, value):
    if not head:
        print("链表为空")
        return

    i = 0
    p = head
    while p and i < pos - 1:
        p = p.next
        i += 1

    if not p or i != pos - 1:
        print("插入位置无效")
        return

    new_node = ListNode(value)
    new_node.next = p.next
    p.next = new_node

# 创建链表 1 -> 2 -> 3
node3 = ListNode(3)
node2 = ListNode(2, node3)
head = ListNode(1, node2)

# 在第二个节点后插入值为 4 的节点
insert_node(head, 2, 4)

# 打印链表
p = head
while p:
    print(p.value, end=" -> ")
    p = p.next
print("None")

上面的代码演示了如何在链表中插入一个节点。接下来,我们再来演示链表的删除操作。假设我们要删除上面链表中的第二个节点。下面是代码实现:

def delete_node(head, pos):
    if not head:
        print("链表为空")
        return

    i = 0
    p = head
    while p and i < pos - 1:
        p = p.next
        i += 1

    if not p or not p.next or i != pos - 1:
        print("删除位置无效")
        return

    q = p.next
    p.next = q.next
    deleted_value = q.value
    del q

    print("删除节点的值为:", deleted_value)

# 删除第二个节点
delete_node(head, 2)

# 打印链表
p = head
while p:
    print(p.value, end=" -> ")
    p = p.next
print("None")

删除操作: 链表的删除操作可以分为删除头节点、删除尾节点和删除中间节点三种情况。在单向链表中,它们的实现方法如下:删除头节点:将头节点的指针指向下一个节点,释放原来的头节点即可。 删除尾节点:遍历链表找到尾节点的前一个节点,将其指针指向空,释放原来的尾节点即可。 删除中间节点:遍历链表找到要删除的节点的前一个节点,将其指针指向要删除的节点的后一个节点,释放要删除的节点即可。

通过以上代码,我们实现了链表的插入和删除操作,并通过具体的示例演示了操作的过程。让我们通过一个具体的例子来演示链表的插入操作。

假设我们有一个包含以下元素的链表:1 -> 2 -> 3 -> 4 -> 5,现在我们要在链表的中间位置插入一个新的节点,值为6。

首先,我们定义链表节点的结构体如下:

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

接下来,我们定义一个函数来在链表的中间位置插入新节点:

void insertNode(ListNode* head, int pos, int val) {
    ListNode* newNode = new ListNode(val);
    ListNode* p = head;
    int i = 1;
    while (p != nullptr && i < pos) {
        p = p->next;
        i++;
    }
    if (p == nullptr) {
        cout << "插入位置超出链表长度!" << endl;
        return;
    }
    newNode->next = p->next;
    p->next = newNode;
}

接着,我们调用这个函数来在链表的第三个位置插入节点值为6的新节点:

int main() {
    ListNode* head = new ListNode(1);
    head->next = new ListNode(2);
    head->next->next = new ListNode(3);
    head->next->next->next = new ListNode(4);
    head->next->next->next->next = new ListNode(5);

    insertNode(head, 3, 6);

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

    return 0;
}

运行以上代码,我们会得到插入新节点后的链表:1 -> 2 -> 3 -> 6 -> 4 -> 5。

这样,我们通过一个具体的例子演示了链表的插入操作。

以上是链表的基本操作,通过这些操作我们可以对链表进行增删改查。在实际应用中,链表常用于实现队列、栈、LRU缓存等数据结构和算法,能够帮助我们更高效地解决问题。

希望通过本文的介绍,读者能够更加深入地理解链表的原理和实现,掌握链表的基本操作方法。在刷LeetCode上的链表题目时,可以更加游刃有余地解决问题,提升自己的编程能力和解题能力。链表虽然简单,但却是算法和数据结构中不可或缺的重要内容,希望大家能够多多练习,不断提升自己的技术水平!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值