輸入一個單向鏈表和一個節點的值,從單向鏈表中刪除等于該值的節點,刪除后如果鏈表中無節點則返回空指針。
鏈表的值不能重復。構造過程,例如輸入一行數據為:6 2 1 2 3 2 5 1 4 5 7 2 2則第一個參數6表示輸入總共6個節點,第二個參數2表示頭節點值為2,剩下的2個一組表示第2個節點值后面插入第1個節點值,為以下表示:1 2 表示為2->1鏈表為2->1,3 2表示為2->3鏈表為2->3->1,5 1表示為1->5鏈表為2->3->1->5,4 5表示為5->4鏈表為2->3->1->5->4,7 2表示為2->7鏈表為2->7->3->1->5->4最后的鏈表的順序為 2 7 3 1 5 4最后一個參數為2,表示要刪掉節點為2的值刪除,則結果為 7 3 1 5 4
數據范圍:鏈表長度滿足1≤n≤1000,節點中的值滿足0≤val≤10000 測試用例保證輸入合法。
輸入描述:輸入一行,有以下4個部分:
1 輸入鏈表結點個數
2 輸入頭結點的值
3 按照格式插入各個結點
4 輸入要刪除的結點的值
輸出描述:輸出一行輸出刪除結點后的序列,每個數后都要加空格。
輸入:5 2 3 2 4 3 5 2 1 4 3
輸出:2 5 4 1
說明:形成的鏈表為2->5->3->4->1刪掉節點3,返回的就是2->5->4->1
輸入:6 2 1 2 3 2 5 1 4 5 7 2 2
輸出:7 3 1 5 4
#include <stdio.h>
#include <stdlib.h>typedef struct tagNode {int val;struct tagNode *next;
} Node;static void insertNode(Node *head, int aim, int val) {while(head != NULL) {if(head->val == aim) {Node *temp = (Node*)malloc(sizeof(Node));temp->val = val;temp->next = head->next;head->next = temp;return;}head = head->next;}
}static void delNode(Node **head, int aim)
{if ((*head)->val == aim) {Node *temp = (*head)->next;free(*head);*head = temp;return;}Node *iter = *head;while (iter->next != NULL) {if (iter->next->val == aim) {Node *temp = iter->next;iter->next = temp->next;free(temp);return;}iter = iter->next;}
}static void printList(Node *head) {while(head != NULL) {printf("%d ", head->val);head = head->next;}printf("\n");
}static void freeList(Node *head) {while(head != NULL){Node *next = head->next;free(head);head = next;}
}int main() {int num = 0;int headVal = 0;int delVal = 0;scanf("%d %d", &num, &headVal);Node *head = (Node*)malloc(sizeof(Node));head->next = NULL;head->val = headVal;int i;for (i = 1; i < num; i++) {int aim = 0;int val = 0;scanf("%d %d", &val, &aim);insertNode(head, aim, val);}scanf("%d", &delVal);delNode(&head, delVal);printList(head);freeList(head);return 0;
}