无头单链表删除随机节点
2015-10-19 23:01
316 查看
#include<iostream>
#include<string>
#include<iterator>
using namespace std;
// 从无头单链表中删除节点
// 假设一个没有头指针的单链表,一个指针指向此单链表中间的一个节点(不是第一个也不是最后一个节点),请将该结点从单链表中删除
// 创建节点
typedef struct node
{
int data;
struct node *next;
}Node;
// 创建链表
struct node*createList(struct node*);
// 输出链表
void printList(struct node*);
// 删除随机链表中的结点
void deleteRondomNode(struct node*);
// 释放内存
void freeMemory(struct node*);
int main()
{
struct node* head=NULL;
head=createList(head);
printList(head);
// 链表中至少含有四个数据
Node *rondomNode=head->next->next; // 我们假设删除第三个节点 deleteRondomNode这个函数里面只有一个指针,没有head指针
deleteRondomNode(rondomNode); // 注意:这里head只是进行输出标记,处理的时候并没有使用到它
printList(head);
freeMemory(head); // 释放内存 这一步不能省略 new分配空间在堆区,不能自动释放
system("pause");
return 0;
}
// 创建链表
struct node*createList(struct node*head)
{
struct node *p=nullptr,*q=nullptr;
unsigned int ival;
cout<<"Input integers:"<<endl; // 输入非整数结束循环
while (cin>>ival)
{
p=new Node;
p->data=ival;
p->next=nullptr; // 分配内存空间,给p赋值
if(head==NULL)
head=q=p;
else
{
q->next=p;
q=q->next;
}
}
return head;
}
// 删除随机链表中的结点 不能借助头指针 头指针的作用只是输出的时候看下结点是否被删除
void deleteRondomNode(Node *pCurrent)
{
if(pCurrent==nullptr) // p不符合题意
return;
else
{
Node *qNext=pCurrent->next;
if(qNext==nullptr) // p为最后一个节点,不符合题意
return;
else
{
pCurrent->data=qNext->data; // 狸猫换太子的做法
pCurrent->next=qNext->next;
delete qNext;
}
}
}
// 输出链表
void printList(struct node *head)
{
Node *p=head;
cout<<"链表输出数据:"<<endl;
while (p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
// 释放内存
void freeMemory(struct node *head)
{
Node *p;
while (head!=nullptr)
{
p=head->next;
delete head;
head=p;
}
}
#include<string>
#include<iterator>
using namespace std;
// 从无头单链表中删除节点
// 假设一个没有头指针的单链表,一个指针指向此单链表中间的一个节点(不是第一个也不是最后一个节点),请将该结点从单链表中删除
// 创建节点
typedef struct node
{
int data;
struct node *next;
}Node;
// 创建链表
struct node*createList(struct node*);
// 输出链表
void printList(struct node*);
// 删除随机链表中的结点
void deleteRondomNode(struct node*);
// 释放内存
void freeMemory(struct node*);
int main()
{
struct node* head=NULL;
head=createList(head);
printList(head);
// 链表中至少含有四个数据
Node *rondomNode=head->next->next; // 我们假设删除第三个节点 deleteRondomNode这个函数里面只有一个指针,没有head指针
deleteRondomNode(rondomNode); // 注意:这里head只是进行输出标记,处理的时候并没有使用到它
printList(head);
freeMemory(head); // 释放内存 这一步不能省略 new分配空间在堆区,不能自动释放
system("pause");
return 0;
}
// 创建链表
struct node*createList(struct node*head)
{
struct node *p=nullptr,*q=nullptr;
unsigned int ival;
cout<<"Input integers:"<<endl; // 输入非整数结束循环
while (cin>>ival)
{
p=new Node;
p->data=ival;
p->next=nullptr; // 分配内存空间,给p赋值
if(head==NULL)
head=q=p;
else
{
q->next=p;
q=q->next;
}
}
return head;
}
// 删除随机链表中的结点 不能借助头指针 头指针的作用只是输出的时候看下结点是否被删除
void deleteRondomNode(Node *pCurrent)
{
if(pCurrent==nullptr) // p不符合题意
return;
else
{
Node *qNext=pCurrent->next;
if(qNext==nullptr) // p为最后一个节点,不符合题意
return;
else
{
pCurrent->data=qNext->data; // 狸猫换太子的做法
pCurrent->next=qNext->next;
delete qNext;
}
}
}
// 输出链表
void printList(struct node *head)
{
Node *p=head;
cout<<"链表输出数据:"<<endl;
while (p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
// 释放内存
void freeMemory(struct node *head)
{
Node *p;
while (head!=nullptr)
{
p=head->next;
delete head;
head=p;
}
}
相关文章推荐
- Android adb命令的使用方法
- kafka.common.ConsumerRebalanceFailedException :log-push-record-consumer-group_mobile-pushremind02.lf
- 对关系数据库标准语言SQL的简单认识
- Linux less 命令 【转载】
- opencv3计算轮廓的长度-arcLength函数
- Android实现图片滚动控件,含页签功能
- Tricks of Android's GUI
- 01.ZooKeeper安装和介绍
- Android_05_多线程断点续传下载
- 斤斤计较的人永远不会获得幸福
- 使用cookie绕过验证码进行模拟登录
- opencv3计算轮廓的面积-contourArea函数
- 熟悉ALM环境,建立域,项目,用户名等; 练习创建发布树。
- QT Win7开发环境安装配置程
- 【C】贪心算法
- Linux下的socket编程实践(七) I/O多路复用技术之select模型
- LA4998 Simple Encryption
- Linux命令行在su root后突然变成bash-4.1$的办法
- HTML5——Web存储API,sessionStorage和localStorage
- Periodic Strings Uva455 【KMP】