在单链表中删除指定值的节点

问题描述:

给定一个链表的头结点head和一个整数num,请实现函数将值为num的节点全部删除。

例如:链表为1->2->3->5->3->6->null,num=3,调整后的链表为: 1->2->5->6->null

算法实现:

public class Node {

    public int value;    public Node next;

    public Node(int value) {        this.value = value;    }}

算法1:
public Node removeValue1(Node head, int num) {

    Stack<Node> stack = new Stack<>();    while (head != null) {        if(head.value != num) {            stack.push(head);        }        head = head.next;    }

    while (!stack.isEmpty()) {

        stack.peek().next = head;        head = stack.pop();    }

    return head;}

算法2:
public Node removeValue2(Node head, int num) {

    while (head != null) {

        if(head.value != num) {            break;        }        head = head.next;    }

    Node pre = head;    Node cur = head;    while (cur != null) {

        if(cur.value == num) {            pre.next = cur.next;        } else {            pre = cur;        }        cur = cur.next;    }

    return head;}

算法解析:

解法1:

需要一个额外的栈空间,通过将“有效的数据入栈”,之后在出栈的过程中重新“链节点成表”,要注意的是出栈时“head”指向的移动。

解法2:

先通过判断和必要的移动,找到“最终的头结点”,设置两个临时变量指向head, 通过这两个变量的移动、赋值、比较判断,将“最终头指针”之后待删除的节点移除掉。

原文地址:https://www.cnblogs.com/heibingtai/p/12656294.html

时间: 2024-10-10 12:29:23

在单链表中删除指定值的节点的相关文章

【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

栈和队列----删除无序单链表中值重复出现的节点

删除无序单链表中值重复出现的节点 给定一个无序单链表的头节点head,删除其中值重复的节点 例如: 1->2->3->3->4->4->2->1->1->null 删除之后变为 1->2->3->4->null 方法1:如果链表长度为N,时间复杂度达到O(N) 方法2:如果要求空间复杂度为O(1),应该怎样实现 [解析] 方法1:利用哈希表去实现 使用哈希表,因为头节点是不用删除的节点,所以首先将头节点放入到哈希表中,然后从下一

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

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

删除单链表中倒数第 k 个节点

思路 1 :两个指针 p1 ,p2 ,p1从头开始遍历,当 p1 到达第 k 个节点时,p2 开始: 当 P1 到达链表的最后一个节点时,p2 所指的节点则为链表中倒数第 k 个节点. public class Node{ public int data; public Node next; public Node(int data){ this.data = data; } public Node removeLastKNode(Node head,int k){ if(head == nul

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

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

js从数组中删除指定值的元素,而不是指定位置

比如数组{1,2,3,4,5},我要删除其中的元素3,但是这个3的位置我是不知道的, 只知道要删除值为3的这一个元素. 如果没有使用第三方框架,有类似的扩展功能可以根据指定值,返回元素的下标的话,只能自己先查找,然后再删除. <script type="text/javascript"> Array.prototype.indexOf = function(val) { for (var i = 0; i < this.length; i++) { if (this[

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

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