您的位置:首页 > Web前端

剑指offer 链表

2017-11-19 09:04 204 查看
链表是一种较为简单的数据结构,但是其相关的问题也是相对较为复杂的。

链表的结构很简单,它是由指针把若干个结点连接成的链状结构。由于其是一种动态的数据结构,所以一般是对指针进行操作。

在遇到链表的问题时,有几点需要注意的地方:

我们需要对链表结构有正确的认识
我们需要对传入的指针做正确的输入判断
我们需要对头指针的特殊性进行判断(删除结点、插入结点)
临时结点的应用可以使得传入参数无需改变,const函数由此产生
删除结点情况下,需要对其指针进行置NULL操作
#include <iostream>
#include <string>
#include <vector>
using namespace std;

typedef int datatype;

struct Node
{
datatype value;
Node* Next_Node;
};

//根据value查找结点
//当给一个链表加入第一个结点时,我们用一个指针指向该结点,但是由于可能会新插入结点到头部,我们就用一个指针来指向头指针,以改动头指针
bool Find_Node(Node **first,datatype value_tobefound)
{
if ((first == NULL) || ((*first) == NULL))
{
return false;
}

Node *Node_temp = *first;
while (Node_temp != NULL)
{
if (Node_temp->value == value_tobefound)
{
return true;
}
else
{
Node_temp = Node_temp->Next_Node;
}
}
return false;
}

//根据value删除结点
void Delete_Node(Node **first,datatype value_tobedeleted)
{
if ((first == NULL) || (*first == NULL))
{
return;
}

//**先将待删除结点的指针设置为空
Node *Tobedeleted = nullptr;

//**如果第一个结点就是待删除结点,需要将第二个结点设置为首节点
if ((*first)->value == value_tobedeleted)
{
Tobedeleted = *first;
*first = (*first)->Next_Node;
}
else
{
//**设置一个临时Node存放结点(方便表示下一个节点)
Node * Node_temp = *first;
while (Node_temp != NULL)
{
if (Node_temp->Next_Node->value == value_tobedeleted)
{
//由于需要删除改结点,所以需要将待删除结点的下一个结点设置为当前结点的下一个结点
//使用临时结点,可以保证传入的first指针指向不变
Tobedeleted = Node_temp->Next_Node;
Node_temp->Next_Node = Node_temp->Next_Node->Next_Node;

}
else
{
Node_temp = Node_temp->Next_Node;
}
}
}

if (Tobedeleted != NULL)
{
//delete只是删除其指向的内容,仍然需要使指针指向NULL
delete Tobedeleted;
Tobedeleted = NULL;
}
}

//由数值在结尾插入结点
bool Insert_Node(Node **first,datatype value_Insert)
{
//产生一个新结点
Node *New_Node = new Node;
New_Node->value = value_Insert;
New_Node->Next_Node = NULL;

//输入合法判断
if (first == NULL)
{
return false;
}

if (*first == NULL)
{
*first = New_Node;
}
else
{
//使用临时结点,可以保证传入的first指针指向不变
Node *Node_temp = *first;
while (Node_temp->Next_Node != NULL)
{
Node_temp = Node_temp->Next_Node;
}
Node_temp->Next_Node = New_Node;
}
}

void main()
{

system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息