链表是一种动态的数据结构,因为在创建链表时,不需要知道链表的长度,只需要对指针进行操作。
1. 链表的定义
struct ListNode{
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL){}
};
2. 在链表的末尾增加一个节点
解决思路:分原来的链表是空链表和非空链表的情况;
特别注意:函数的第一个参数head是一个指向指针的指针,当向一个空链表中插入一个节点时,新插入的节点就是链表的头指针,由于此时会改动头指针,因此必须把head参数设为指针的指针,否则出了这个函数head仍然是一个空指针。
//添加一个节点到链表的末尾
void AddtoListNodeTail(ListNode** head, int value){
ListNode* newNode = new ListNode(value);
if (*head == NULL){
*head = newNode;
}
else{
ListNode* pNode = *head;
while (pNode->next != NULL)
pNode = pNode->next;
pNode->next = newNode;
}
}
3. 在链表中找到第一个含有指定值的结点并删除该结点
解决思路:分两种情况:
1)要删除的值就在头结点中
2)要删除的值不在头结点中
//找到第一个含有某个值的节点并删除该节点
void RemoveFirstValue(ListNode **head, int value){
if (head == NULL || *head == NULL) return;
ListNode* RemoveNode = NULL;
//要删除的是头节点
if ((*head)->val == value){
RemoveNode = *head;
*head = (*head)->next;
}
//要删除的不是头节点
else{
ListNode *node = *head;
while (node->next != NULL && node->next->val != value){
node = node->next;
}
if (node->next != NULL && node->next->val == value){
RemoveNode = node->next;
node->next = node->next->next;
}
}
if (RemoveNode != NULL){
delete RemoveNode;
RemoveNode = NULL;
}
}