链表的插入与删除

简介: 链表的插入与删除

题目描述

输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。

链表结点定义如下:

struct ListNode
{
  int       m_nKey;
  ListNode* m_pNext;
};

详细描述:

本题为考察链表的插入和删除知识。

链表的值不能重复

构造过程,例如

1 <- 2

3 <- 2

5 <- 1

4 <- 5

7 <- 2

最后的链表的顺序为 2 7 3 1 5 4

删除 结点 2

则结果为 7 3 1 5 4

#include <iostream>
using namespace std;
typedef struct ListNode
{
  int m_nKey;
  struct ListNode* m_pNext;
}ListNode;
//创建链表头结点
ListNode* creatList(int headNumber)
{
  //ListNode* pHead = new ListNode[number];
  ListNode* pHead = new ListNode;
  pHead->m_nKey = headNumber;
  pHead->m_pNext = NULL;
  return pHead;
}
//插入元素
void insertList(ListNode* head, int data, int position)
{
  ListNode* pCurrent = head;
  while (pCurrent->m_nKey != position)
  {
    pCurrent = pCurrent->m_pNext;
  }
  ListNode* pTemp = new ListNode;
  pTemp->m_nKey = data;
  pTemp->m_pNext = pCurrent->m_pNext;
  pCurrent->m_pNext = pTemp;
}
//删除元素//若删除后链表为空则返回空指针
ListNode* deleteList(ListNode* head, int data)
{
  if (head->m_nKey == data && head->m_pNext == NULL)
  {
    return NULL;
  }
  if (head->m_nKey == data)
  {
    ListNode* pHead = head->m_pNext;
    return pHead;
  }
  ListNode* pPre = head;
  ListNode* pCurrent = pPre->m_pNext;
  while (pPre->m_pNext != NULL)
  {
    if (pCurrent->m_nKey == data)
    {
      pPre->m_pNext = pCurrent->m_pNext;
    }
    pPre = pPre->m_pNext;
    pCurrent = pCurrent->m_pNext;
  }
  return head;
}
//打印链表
void printList(ListNode* head)
{
  ListNode* pTemp = head;
  while (pTemp->m_pNext != NULL)
  {
    cout << pTemp->m_nKey << " ";
    pTemp = pTemp->m_pNext;
  }
  cout << pTemp->m_nKey << " ";
}
int main()
{
  int num; //链表节点数
  while (cin >> num)
  {
    int headNumber = 0;
    cin >> headNumber;
    ListNode* pHead = creatList(headNumber);
    for (int i = 0; i < num - 1; i++)
    {
      int data, position;
      cin >> data >> position;
      insertList(pHead, data, position);
    }
    //printList(pHead);
    //cout << endl;
    int deldata;
    cin >> deldata;
    ListNode* pHead2 = deleteList(pHead, deldata);
    printList(pHead2);
    cout << endl;
  }
  return 0;
}


相关文章
|
4月前
|
存储
数据结构:图文详解单链表的各种操作(头插法,尾插法,任意位置插入,删除节点,查询节点,求链表的长度,清空链表)
数据结构:图文详解单链表的各种操作(头插法,尾插法,任意位置插入,删除节点,查询节点,求链表的长度,清空链表)
258 0
|
3月前
|
NoSQL 容器 消息中间件
二叉搜索树查询/插入/求前驱/求后继/删除
二叉搜索树查询/插入/求前驱/求后继/删除
二叉搜索树查询/插入/求前驱/求后继/删除
|
8月前
|
存储 C++
链表操作:插入、删除与遍历
(笔者画图不易呜呜)链表是一种基本的数据结构,它可以用来存储一系列的元素,并且支持灵活的插入、删除操作。在计算机科学中,链表常常用于构建更复杂的数据结构,如栈、队列以及图等。
193 0
|
9月前
链表学习(链表的创建,插入,删除,查找,遍历)
链表学习(链表的创建,插入,删除,查找,遍历)
86 0
|
10月前
|
算法 Java
优雅的删除链表元素
大家好,我是王有志。今天我们尝试使用多种方法,“优雅”的实现链表的删除方法。
103 0
优雅的删除链表元素
|
10月前
|
算法
单链表结点的插入与删除
单链表结点的插入与删除
77 0
双链表全部知识总结(初始化、插入、删除、遍历)
双链表知识总结包括思路分析、代码实现
180 0
|
存储 C语言 C++
顺序表的插入、删除和查找(四)
详细介绍了数据结构中的顺序表
219 0
9.删除链表中的重复结点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
48 0

热门文章

最新文章