您的位置:首页 > 其它

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点

2014-06-27 15:37 531 查看
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stack>
using namespace std;

struct Node
{
int data;
struct Node* next;
};

struct Node* create_list(int len)
{
if (len <= 0)
return NULL;

struct Node* head;
struct Node* tmp;
struct Node* pre;
for (int i=0; i<len; i++)
{
if (i == 0)
{
head = tmp = new struct Node;
cin >> tmp->data;
tmp->next = NULL;
pre = tmp;
continue;
}
tmp = new struct Node;
cin >> tmp->data;
tmp->next = NULL;
pre->next = tmp;
pre = tmp;
}

return head;
}

void visit(const struct Node *head)
{
if (head == NULL)
return;
const struct Node *tmp;
tmp = head;
while (tmp)
{
cout << tmp->data;
tmp = tmp->next;
}
}

void free_list(struct Node *head)
{
if (head == NULL)
return;
struct Node *tmp;
while (head)
{
tmp = head;
head = head->next;
delete tmp;
}
}

struct Node* DeleteNode(struct Node *head, struct Node *toDeleteNode)
{
if (!head || !toDeleteNode)
return NULL;

struct Node* tmp = head->next;
struct Node* pre = head;

if (head == toDeleteNode)
{
delete head;
return tmp;
}

//要删除的结点不是尾结点
if (toDeleteNode->next)
{
int tmpData = toDeleteNode->data;
toDeleteNode->data = (toDeleteNode->next)->data;
(toDeleteNode->next)->data = tmpData;
tmp = toDeleteNode->next;
toDeleteNode->next = (toDeleteNode->next)->next;
delete tmp;
return head;
}

//不止一个结点,要删除的结点是尾结点
while (tmp->next)
{
tmp = tmp->next;
pre = pre->next;
}
pre->next = NULL;
delete tmp;
return head;
}

int main()
{
struct Node *head = create_list(5);
visit(head);
cout << endl;

//删除头结点
head = DeleteNode(head, head);
visit(head);
cout << endl;
//删除尾结点
struct Node* tmp = head;
while (tmp->next)
tmp = tmp->next;
head = DeleteNode(head, tmp);
visit(head);
cout << endl;
//删除第2个结点
int num = 0;
tmp = head;
while (tmp->next)
{
num++;
if (num == 2)
break;
tmp = tmp->next;
}
head = DeleteNode(head, tmp);
visit(head);
cout << endl;
free_list(head);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐