编程之美——从无头单链表中删除节点
来源:互联网 发布:群智能算法 编辑:程序博客网 时间:2024/04/28 01:57
编程之美——从无头单链表中删除节点
问题:假设有一个没有头指针的单链表。一个指针指向此单链表中间的一个节点,请将该节点从单链表中删除。
分析:典型的“狸猫换太子”, 若要删除该节点,正常情况下,应该要知道该节点的前面节点的指针,但是由于单链表中没有头结点,所以无法追溯到该节点前面的那个节点,因此,这里采用了“移花接木”的方法。设该节点为B,下一个节点为C。那么,首先将B节点的内容替换为C节点的内容,然后,将C节点删除,这样就达到了我们的目的。代码如下:
// lianbiao.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef struct node{
int data;
node *next;
}Node;
void deleteNode(Node *pCurrent,Node *head)
{
if(pCurrent!=NULL)
{
if(pCurrent->next!=NULL)
{
Node *pTemp=pCurrent->next;
pCurrent->data=pTemp->data;
pCurrent->next=pTemp->next;
delete pTemp;
}
else
{
Node *temp=head;
while(temp!=NULL)
{
if(temp->next==pCurrent)
{
delete pCurrent;
temp->next=NULL;
}
temp=temp->next;
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Node *n1=new Node();
Node *n2=new Node();
Node *n3=new Node();
n1->data=1;
n1->next=n2;
n2->data=2;
n2->next=n3;
n3->data=3;
n3->next=NULL;
printf("before delete:");
Node *temp=n1;
while(temp!=NULL)
{
printf("%d",temp->data);
temp=temp->next;
}
printf("after delete:");
deleteNode(n3,n1);
temp=n1;
while(temp!=NULL)
{
printf("%d",temp->data);
temp=temp->next;
}
system("pause");
return 0;
}
//
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef struct node{
int data;
node *next;
}Node;
void deleteNode(Node *pCurrent,Node *head)
{
if(pCurrent!=NULL)
{
if(pCurrent->next!=NULL)
{
Node *pTemp=pCurrent->next;
pCurrent->data=pTemp->data;
pCurrent->next=pTemp->next;
delete pTemp;
}
else
{
Node *temp=head;
while(temp!=NULL)
{
if(temp->next==pCurrent)
{
delete pCurrent;
temp->next=NULL;
}
temp=temp->next;
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Node *n1=new Node();
Node *n2=new Node();
Node *n3=new Node();
n1->data=1;
n1->next=n2;
n2->data=2;
n2->next=n3;
n3->data=3;
n3->next=NULL;
printf("before delete:");
Node *temp=n1;
while(temp!=NULL)
{
printf("%d",temp->data);
temp=temp->next;
}
printf("after delete:");
deleteNode(n3,n1);
temp=n1;
while(temp!=NULL)
{
printf("%d",temp->data);
temp=temp->next;
}
system("pause");
return 0;
}
拓展题:编写一个函数,给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来。
分析:可以用三个指针进行遍历,在遍历的途中,进行逆置。
核心代码为:
void Reverse(Node *head)
{
if(head==NULL)
return;
Node* prev=NULL;
Node* curr=head;
Node* next=NULL;
while(curr)
{
next=curr->next;
curr->next=prev;
prev=curr;
curr=next;
}
}
{
if(head==NULL)
return;
Node* prev=NULL;
Node* curr=head;
Node* next=NULL;
while(curr)
{
next=curr->next;
curr->next=prev;
prev=curr;
curr=next;
}
}
- 编程之美——从无头单链表中删除节点
- 《编程之美》——从无头单链表中删除节点
- 编程之美--从无头单链表中删除节点
- 编程之美-从无头单链表中删除节点
- 编程之美之从无头单链表中删除节点
- 编程之美3.4 从无头单链表中删除节点
- 从无头单链表中删除某节点(编程之美3.4)
- [编程之美] PSet3.4 从无头单链表中删除节点
- 编程之美:从无头单链表中删除节点,讨论
- 编程之美-从无头单链表中删除节点方法整理
- 《编程之美》3.4 从无头单链表中删除/添加节点
- 读书笔记之编程之美 - 3.4 从无头链表中删除节点
- 编程之美--3.4从无头单链表删除节点
- 编程之美:第三章 结构之法 3.4从无头单链表中删除节点
- 编程之美-从无头单链表中删除结点
- 【编程之美】从无头单链表中删除结点
- 编程之美—从无头链表中删除结点
- 编程之美 - 无头链表删除节点
- “手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动
- 调整eclipse操作界面
- apache配置文件详解
- 简单算法 - 找到链表的中间点和倒数第K个节点(普通方法和快慢指针方法开销一样)
- SVN图标不能正常显示
- 编程之美——从无头单链表中删除节点
- Bootloard--uboot移植
- SQL 通配符
- JVM内存原理,weblogic内存的调优
- 栈实现反序读文件
- spring中AOP的Annotation使用流程
- fabric
- [SQL] patindex 详解
- jre jdk 区别