剑指offer 链表
2017-11-19 09:04
204 查看
链表是一种较为简单的数据结构,但是其相关的问题也是相对较为复杂的。
链表的结构很简单,它是由指针把若干个结点连接成的链状结构。由于其是一种动态的数据结构,所以一般是对指针进行操作。
在遇到链表的问题时,有几点需要注意的地方:
我们需要对链表结构有正确的认识
我们需要对传入的指针做正确的输入判断
我们需要对头指针的特殊性进行判断(删除结点、插入结点)
临时结点的应用可以使得传入参数无需改变,const函数由此产生
删除结点情况下,需要对其指针进行置NULL操作
链表的结构很简单,它是由指针把若干个结点连接成的链状结构。由于其是一种动态的数据结构,所以一般是对指针进行操作。
在遇到链表的问题时,有几点需要注意的地方:
我们需要对链表结构有正确的认识
我们需要对传入的指针做正确的输入判断
我们需要对头指针的特殊性进行判断(删除结点、插入结点)
临时结点的应用可以使得传入参数无需改变,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"); }
相关文章推荐
- LintCode-剑指Offer-(112)删除排序链表中的重复元素
- 剑指Offer : BST转为双向链表
- 剑指offer-反转链表
- 剑指offer 面试题15 链表中的倒数第k个节点
- 剑指Offer15 合并两个已排序链表
- 剑指offer 面试题17 合并两个排序的链表
- [剑指Offer] 16.合并两个排序链表
- 剑指offer-16:反转链表
- 【剑指offer】面试题13、在 O(1)时间上删除链表结点
- 剑指offer-倒序打印链表
- 剑指Offer—— 链表的公共点
- 剑指offer 37 - 两个链表的第一个公共节点
- 剑指offer 反转链表
- 【剑指offer】面试题24:反转链表
- 剑指offer_合并两个排序的链表
- 【剑指offer】从尾到头打印链表
- 剑指offer 之 合并两个排序的链表
- 剑指Offer - 九度1519 - 合并两个排序的链表
- 剑指offer-从尾到头打印链表
- 【剑指offer】复杂链表的复制