删除链表中间节点

思路:经过我的归纳,链表每增加2,要删除的节点就向后移动一个

public class Node {
    public int vaule;
    public Node next;

    public Node(int data){
        vaule=data;
    }
}

public static Node removeMidNode(Node head){
        if(head==null||head.next==null){
            return head;
        }
        if(head.next.next==null){
            return head.next;
        }
        Node pre=head;
        Node cur=head.next.next;
        while (cur.next!=null&&cur.next.next!=null){
            pre=pre.next;
            cur=cur.next.next;
        }
        pre.next=pre.next.next;
        return head;
    }


要在C语言中删除链表中间节点,首先需要找到该节点。假设链表单链表,且没有提供链表长度,我们可以使用快慢指针的方法来找到中间节点。 以下是一个完整的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点 struct ListNode { int val; struct ListNode *next; }; // 删除链表中间节点 void deleteMiddle(struct ListNode** head) { if (*head == NULL || (*head)->next == NULL) { // 如果链表为空或只有一个节点,删除头节点 struct ListNode* temp = *head; *head = NULL; free(temp); return; } struct ListNode *slow = *head; struct ListNode *fast = *head; struct ListNode *prev = NULL; // 快指针每次移动两步,慢指针每次移动一步 while (fast != NULL && fast->next != NULL) { prev = slow; slow = slow->next; fast = fast->next->next; } // 删除慢指针指向的节点 prev->next = slow->next; free(slow); } // 打印链表 void printList(struct ListNode* head) { struct ListNode* current = head; while (current != NULL) { printf("%d -> ", current->val); current = current->next; } printf("NULL\n"); } // 创建新节点 struct ListNode* newNode(int val) { struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode)); node->val = val; node->next = NULL; return node; } int main() { // 创建链表 1 -> 2 -> 3 -> 4 -> 5 -> NULL struct ListNode* head = newNode(1); head->next = newNode(2); head->next->next = newNode(3); head->next->next->next = newNode(4); head->next->next->next->next = newNode(5); printf("原始链表: "); printList(head); deleteMiddle(&head); printf("删除中间节点后的链表: "); printList(head); return 0; } ``` ### 代码解释: 1. **链表节点定义**:定义了`ListNode`结构体,包含`val`和`next`指针。 2. **删除中间节点函数**: - 使用快慢指针找到中间节点。 - 快指针每次移动两步,慢指针每次移动一步。当快指针到达链表末尾时,慢指针指向中间节点。 - 保存慢指针的前一个节点,以便删除中间节点。 3. **打印链表**:遍历链表并打印每个节点的值。 4. **创建新节点**:动态分配内存并初始化新节点。 5. **主函数**:创建链表,打印原始链表删除中间节点,然后打印删除后的链表。 ### 示例输出: ``` 原始链表: 1 -> 2 -> 3 -> 4 -> 5 -> NULL 删除中间节点后的链表: 1 -> 2 -> 4 -> 5 -> NULL ``` ### 注意事项: - 如果链表长度为偶数,则删除的是中间偏后的节点(如链表长度为4,删除第3个节点)。 - 如果链表为空或只有一个节点,直接删除头节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值