剑指offer 链表

链表是一种较为简单的数据结构,但是其相关的问题也是相对较为复杂的。

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

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

  • 我们需要对链表结构有正确的认识
  • 我们需要对传入的指针做正确的输入判断
  • 我们需要对头指针的特殊性进行判断(删除结点、插入结点)
  • 临时结点的应用可以使得传入参数无需改变,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");
}  


猜你喜欢

转载自blog.csdn.net/misayaaaaa/article/details/78571464