删除链表中所有值为k的节点

1. 问题描述

  给定一个单链表,删除其中值为k的所有节点。例如:1→2→6→3→4→5→6,删除其中值为6的节点,返回:1→2→3→4→5。


2. 方法与思路

  这是一个简单的链表操作题。删除是要考虑的节点所在的位置(头部,中间和尾部),分开处理一下好了。主要过程如下描述:

 

 I. while head?>val≠target

      head = head->next

 II. 判断head是否为空

       if head=NULL return NULL;

 III. 遍历剩余链表,删除中间和尾部值为k的节点。

  c++代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

ListNode* removeElements(ListNode* head, int val) {
        if(head == NULL) return NULL;
        while(head && head->val == val)
        {
            ListNode *pre = head;
            head = head->next;
            delete pre;
        }
        if(head == NULL) return head;
        ListNode *p = head;

        while(p && p->next)
        {
            ListNode *q = p->next;
            if(q->val == val)
            {

                p->next = q->next;
                delete q;
            }
            else
                p = p->next;

        }

        return head;
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 23:03:15

删除链表中所有值为k的节点的相关文章

单链表中查找倒数第K个节点

// 查找链表的倒数第K个结点 PSListNode FindLastKNode(PSListNode pHead, int K ) { PSListNode pFast = pHead ; PSListNode pSlow = pHead ; if (pHead == NULL || K <= 0) { return NULL ; } while (--K ) { if (pFast == NULL ) { return NULL ; } pFast = pFast->pNext; } wh

如何删除链表中值重复的节点

前言 ??最近在刷<剑指offer>的题,其中有一道题目叫做删除链表中重复的节点,我想了半天没想到比较好的解决办法,于是看了看大佬的解析(菜哭了).不看不知道,一看吓一跳,这尼玛写的也太妙了,忍不住写篇博客记录一下这个解题思路和代码. 题目描述 ??在一个排好序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5. 解题思路 ??这道题我

数据结构之 线性表---单链表操作A (删除链表中的指定元素)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

删除链表中倒数第n个节点

1.给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 注意 链表中的节点个数大于等于n 挑战 O(n)时间复杂度 解题思路:刚开始看到倒数第n个节点,不禁感慨如果是数组就可以直接倒着来了.不过针对链表,一定要想起来最常用的方法---快慢指针.设一个fast和slow指针:快指针先走n步,然后快慢指针一起走,

链表《4》删除链表中的结点

下图是一个创建好的链表 下面我们需要删除一个结点,例如删除第3个结点 首先定义一个指针p,并且将p指向第二个结点 然后定义一个指针q,将q指向需要删除的结点 将p指向的结点和q指向的结点相连 p->pNext = q->pNext 清空q指向的结点 free(q); q = NULL; 删除后的链表 程序代码: #include <stdio.h> #include <stdlib.h> typedef struct Node//结点结构 { int data;//数据

删除链表中的重复节点、剩余节点逆序输出

#include <stdlib.h> #include <algorithm> #include <functional> #include <iostream> #include "oj.h" using namespace std; /* 功能: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容重复的节点(重复的节点全部删除),剩余的节点逆序倒排. 输入: pstrIn: 输入一个不带头节点的单向链表 输出:

LeetCode237_Delete Node in a Linked List(删除链表中的节点) Java题解

题目: Write a function to delete a node (except the tail) in a singly linked list, given only access to that node. Supposed the linked list is 1 -> 2 -> 3 -> 4 and you are given the third node with value 3, the linked list should become 1 -> 2 -

找出单向链表中的倒数第k个结点

import java.util.Scanner; public class List { private Node first; private int N; class Node{ int data; Node next; } //顺便复习一下链表 public int size() { return N; } public boolean isEmpty() { return first==null; } public Node FindPrev(int pos){ Node tmp=fi

链表中获取倒数第K个结点

/* * 链表中查找倒数第K个结点.cpp * * Created on: 2018年5月1日 * Author: soyo */ #include<iostream> using namespace std; struct Node { int num; Node * next; }; Node * creat() { Node *head=NULL; head=new Node; head->num=9; head->next=NULL; return head; } Node