1. 程式人生 > >連結串列節點的增加和刪除

連結串列節點的增加和刪除

連結串列是一種動態的資料結構,因為在建立連結串列時,不需要知道連結串列的長度,只需要對指標進行操作。

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;
	}

}