7 查找链表的长度(迭代和递归)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Wekic/article/details/84144466

编写C函数来计算给定单链表中的节点数。

例如,对于链接列表1-> 3-> 1-> 2-> 1,该函数应返回5。

迭代解决方案

1)将计数初始化为0 
2)初始化节点指针,current = head。
3)当current不为NULL时执行以下操作
     a)current=current->next
     b)count ++;
4)返回计数 

以下是算法是C/C++实现,以查找节点数


// Iterative C program to find length or count of nodes in a linked list 
#include<stdio.h> 
#include<stdlib.h> 
  
/* Link list node */
struct Node 
{ 
    int data; 
    struct Node* next; 
}; 
  
/* Given a reference (pointer to pointer) to the head 
  of a list and an int, push a new node on the front 
  of the list. */
void push(struct Node** head_ref, int new_data) 
{ 
    /* allocate node */
    struct Node* new_node = 
            (struct Node*) malloc(sizeof(struct Node)); 
  
    /* put in the data  */
    new_node->data  = new_data; 
  
    /* link the old list off the new node */
    new_node->next = (*head_ref); 
  
    /* move the head to point to the new node */
    (*head_ref)    = new_node; 
} 
  
/* Counts no. of nodes in linked list */
int getCount(struct Node* head) 
{ 
    int count = 0;  // Initialize count 
    struct Node* current = head;  // Initialize current 
    while (current != NULL) 
    { 
        count++; 
        current = current->next; 
    } 
    return count; 
} 
  
/* Drier program to test count function*/
int main() 
{ 
    /* Start with the empty list */
    struct Node* head = NULL; 
  
    /* Use push() to construct below list 
     1->2->1->3->1  */
    push(&head, 1); 
    push(&head, 3); 
    push(&head, 1); 
    push(&head, 2); 
    push(&head, 1); 
  
    /* Check the count function */
    printf("count of nodes is %d", getCount(head)); 
    return 0; 
} 

输出:节点数是5

递归解决方案

int getCount(head)
1)如果head为NULL,则返回0。
2)否则返回1 + getCount(head->next

以下是算法是C/C++实现,以查找节点数

// Recursive C program to find length or count of nodes in a linked list 
#include<stdio.h> 
#include<stdlib.h> 

/* Link list node */
struct Node 
{ 
	int data; 
	struct Node* next; 
}; 

/* Given a reference (pointer to pointer) to the head 
of a list and an int, push a new node on the front 
of the list. */
void push(struct Node** head_ref, int new_data) 
{ 
	/* allocate node */
	struct Node* new_node = 
			(struct Node*) malloc(sizeof(struct Node)); 

	/* put in the data */
	new_node->data = new_data; 

	/* link the old list off the new node */
	new_node->next = (*head_ref); 

	/* move the head to point to the new node */
	(*head_ref) = new_node; 
} 

/* Counts the no. of occurences of a node 
(search_for) in a linked list (head)*/
int getCount(struct Node* head) 
{ 
	// Base case 
	if (head == NULL) 
		return 0; 

	// count is 1 + count of remaining list 
	return 1 + getCount(head->next); 
} 

/* Drier program to test count function*/
int main() 
{ 
	/* Start with the empty list */
	struct Node* head = NULL; 

	/* Use push() to construct below list 
	1->2->1->3->1 */
	push(&head, 1); 
	push(&head, 3); 
	push(&head, 1); 
	push(&head, 2); 
	push(&head, 1); 

	/* Check the count function */
	printf("count of nodes is %d", getCount(head)); 
	return 0; 
} 

输出:节点数是5

猜你喜欢

转载自blog.csdn.net/Wekic/article/details/84144466