单链表初级OJ题【C语言】

typedef struct ListNode 
{
	int val;
	struct ListNode* next;
}ListNode;     //节点

void PrintList(ListNode* head)
{
	while (head!=NULL) {
		printf("%d->",head->val);
		head = head->next;
	}
	printf("NULL\n");
}    //打印每个节点数据

一、删除节点

        给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

        单链表初级OJ题【C语言】_第1张图片 

思路1:直接遇到节点后,把节点前后相连接,把节点让出来释放掉。

struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode* p = head;
    struct ListNode* pre = NULL;

    while (p) {
        if (val == p->val) {
            if (p == head) {
                head = head->next;
                free(p);
                p = head;
            }
            else {
                pre->next = p->next;
                free(p);
                p = pre->next;
            }
        }
        else {
            pre = p;
            p = p->next;
        }
    }
    return head;
}

PS:因为要让节点前后连接,所以注意要保留前一个节点的指针。

        如果是头节点删除,那么不用连接前后节点,直接把链表头节点的下一个节点当成新的头节点,然后删除原来的节点。

        如果节点不是要删除的节点,让指针往下走继续找。

测试:

void test1()
{
	ListNode* p1 = (ListNode*)malloc(sizeof(ListNode));
	p1->val = 1;
	ListNode* p2 = (ListNode*)malloc(sizeof(ListNode));
	p2->val = 2;
	ListNode* p3 = (ListNode*)malloc(sizeof(ListNode));
	p3->val = 3;
	ListNode* p4 = (ListNode*)malloc(sizeof(ListNode));
	p4->val = 4;
	ListNode* p5 = (ListNode*)malloc(sizeof(ListNode));
	p5->val = 5;
	p1->next = p2;
	p2->next = p3;
	p3->next = p4;
	p4->next = p5;
	p5->next = NULL;
	PrintList(p1);
	p1 = removeElements(p1,4);
	PrintList(p1);
}

int main()
{
	test1();
	return 0;
}

单链表初级OJ题【C语言】_第2张图片

 思路2:如果不是要查找的节点把节点拿下来,头插入另一个链表。

单链表初级OJ题【C语言】_第3张图片

 单链表初级OJ题【C语言】_第4张图片

struct ListNode* removeElements(struct ListNode* head, int val){
   
   struct ListNode* tail=NULL;
   struct ListNode* p=head;
   head=NULL;
   while(p){
       if(p->val==val){
           struct ListNode* del=p;
           p=p->next;
           free(del);
       }
       else{
           if(tail==NULL){
               tail=p;
               p=p->next;
               head=tail;
           }
           else{
               tail->next=p;
               tail=tail->next;
               p=p->next;
  

你可能感兴趣的:(c语言,链表,开发语言,c++)