单链表的删除

单链表的删除,就是找到链表节点的前面一个节点,将其与待删节点的下一个节点连接,待删节点断链

function remove(head,val){
    var pre = head;
    while(pre.next && pre.next.val != val){
        pre = pre.next;
    }
    if(pre == null){
        return;
    }
    if(pre.next != null){
        pre.next = pre.next.next;
    }
}

另一种删除方法,已知链表的头节点和待删节点,将待删节点的值赋为下一个节点的值,如果节点为末尾节点(非null),则需找到其前面的节点,将其与待删节点断链

总体时间复杂度仍然为O(1)

function delete(head,node){
    if(node == null){
        return;
    }
    if(node.next != null){
        node.val = node.next.val;
        var temp = node.next;
        node.next = node.next.next;
        temp.next = null;
     temp = null;
    }
    else{
        if(head == node){
            head = null;
        }
        else{
            var pre = head;
            while(pre.next && pre.next.val != node.val){
                pre = pre.next;
            }
            if(pre! = null){
                pre.next = null;
            }
        }
    }
}
时间: 2024-09-30 10:29:48

单链表的删除的相关文章

【LeetCode-面试算法经典-Java实现】【083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)】

[083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a sorted linked list, delete all duplicates such that each element appear only once. For example, Given 1->1->2, return 1->2. Given 1->1->2

从无头单链表中删除节点

1.从无头单链表中删除节点 一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个也不是最后一个节点).将该节点删除. A-->B-->C-->D       =====>     A-->C-->D 问题解析:由于只能单向遍历,故与删除B节点,无法得知B的前驱A,即无法像普通删除中那样让A的next指向C; 这里有个技巧,将C当做B,而B复制成C,则删除C节点即可: 2.给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来. A-->

编程之美:从无头单链表中删除节点,讨论

1.问题描述 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个),请将该节点从单链表中删除. 如下图所示: 这种情况大家都知道,将下一个节点的data和next拷贝到当前节点,并将当前节点的next设置为下下个节点,然后释放下一个节点所占内存(free), 如果红字条件去掉: 还用上面的方法就有问题,一般上面方法的代码如下: void DeleteRandomNode(Node* pCurrent) { if(pCurrent == NULL) ret

习题11-8 单链表结点删除 (20分)

习题11-8 单链表结点删除 (20分) 本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中所有存储了某给定值的结点删除.链表结点定义如下: struct ListNode { int data; ListNode *next; }; 函数接口定义: struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m ); 函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表

单链表的删除操作的实现(0953)swust-oj

#include<stdio.h>#include<stdlib.h>int total;typedef struct node{ int data; struct node * next;}Node;void CreateNode(Node *&L,int a[],int n)//尾插法建立单链表{ int i; Node *p,*r; L=(Node *)malloc(sizeof(struct node )); p=L; for(i=0;i<n;i++) { r

C语言:【单链表】删除一个无头单链表的非尾节点

#include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int DataType; typedef struct SListNode {     DataType data;     struct SListNode* next;  }SListNode; SListNode* BuyNode( DataType x) {     SListNode* next = (SListNode*)mall

3.4 从无头单链表中删除节点

题目:有一个单链表,没有头指针,现在有一个指针指向这个链表的中间的一个节点,要求删除这个节点. 方法:由于没有办法寻求指针去找到要删除的这个节点的前一个节点. 所以要另想办法. 设立新的指针指向要删除的节点的后一个节点,然后把这两个节点里面的数据换一下!然后删除要删除节点的后一个节点! 这样 就ok了! 代码: void DeleteRandomNode(node *pCurrent) { assert(pCurrent != NULL); node *pNext = pCurrent->nex

从单链表中删除最大的元素,单链表元素排序

public class LinkList { public Node head; public LinkList() { head = new Node(); head.next = null; } //尾插法 public void createByTail(int[] arr, int n) { Node tail = head; for(int i=0; i<n; i++) { Node c = new Node(arr[i]); tail.next = c; tail = c; } t

单链表之删除某一位置节点

单链表删除某一位置节点的程序十分容易,但也容易出错.网上流传的一些程序并不正确. 这一程序的关键点在于:删除某一位置节点,那么需首先确定其前驱结点.前驱节点存在一些特例情况:当前节点为空.当前非空但后继为空(尾节点). 同时,还要进行断言以及待删节点为首节点的相关处理.完整程序如下: #include "stdafx.h" #include <stdlib.h> #include <assert.h> typedef struct Node { int data