📜  用于查找给定链表的中间元素的 C 程序

📅  最后修改于: 2022-05-13 01:55:12.347000             🧑  作者: Mango

用于查找给定链表的中间元素的 C 程序

给定一个单链表,找到链表的中间。例如,如果给定的链表是 1->2->3->4->5,那么输出应该是 3。
如果有偶数节点,那么就会有两个中间节点,我们需要打印第二个中间元素。例如,如果给定的链表是 1->2->3->4->5->6,那么输出应该是 4。

方法一:
遍历整个链表并计算编号。的节点。现在再次遍历列表直到 count/2 并返回 count/2 处的节点。

方法二:
使用两个指针遍历链表。将一个指针移动一格,将其他指针移动二格。当快指针到达末尾时,慢指针将到达链表的中间。

下图显示了 printMiddle函数在代码中的工作方式:

C 和 Java1 中给定链表的中间

C
// C program to find middle of linked list
#include 
#include 
  
// Link list node
struct Node 
{ 
    int data; 
    struct Node* next; 
}; 
  
// Function to get the middle of 
// the linked list
void printMiddle(struct Node *head) 
{ 
    struct Node *slow_ptr = head; 
    struct Node *fast_ptr = head; 
  
    if (head!=NULL) 
    { 
        while (fast_ptr != NULL && 
               fast_ptr->next != NULL) 
        { 
            fast_ptr = fast_ptr->next->next; 
            slow_ptr = slow_ptr->next; 
        } 
        printf("The middle element is [%d]", 
                slow_ptr->data); 
    } 
} 
  
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; 
} 
  
// A utility function to print a given
//  linked list 
void printList(struct Node *ptr) 
{ 
    while (ptr != NULL) 
    { 
        printf("%d->", ptr->data); 
        ptr = ptr->next; 
    } 
    printf("NULL"); 
} 
  
// Driver code
int main() 
{ 
    // Start with the empty list 
    struct Node* head = NULL; 
    int i; 
  
    for (i = 5; i > 0; i--) 
    { 
        push(&head, i); 
        printList(head); 
        printMiddle(head); 
    } 
    return 0; 
}


C
// C program to implement the 
// above approach
#include 
#include 
  
// Link list node
struct node 
{
    int data;
    struct node* next;
};
  
// Function to get the middle of 
// the linked list
void printMiddle(struct node* head)
{
    int count = 0;
    struct node* mid = head;
  
    while (head != NULL)
    {
        // Update mid, when 'count' 
        // is odd number
        if (count & 1)
            mid = mid->next;
  
        ++count;
        head = head->next;
    }
  
    // If empty list is provided
    if (mid != NULL)
        printf("The middle element is [%d]", 
                mid->data);
}
  
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;
}
  
// A utility function to print a 
// given linked list
void printList(struct node* ptr)
{
    while (ptr != NULL) 
    {
        printf("%d->", ptr->data);
        ptr = ptr->next;
    }
    printf("NULL");
}
  
// Driver code
int main()
{
    // Start with the empty list 
    struct node* head = NULL;
    int i;
  
    for (i = 5; i > 0; i--) 
    {
        push(&head, i);
        printList(head);
        printMiddle(head);
    }
    return 0;
}


输出:

5->NULL
The middle element is [5]

4->5->NULL
The middle element is [5]

3->4->5->NULL
The middle element is [4]

2->3->4->5->NULL
The middle element is [4]

1->2->3->4->5->NULL
The middle element is [3]

方法三:
将 mid 元素初始化为 head 并将计数器初始化为 0。从 head 遍历列表,同时遍历递增计数器并在计数器为奇数时将 mid 更改为 mid->next。所以中间只会移动列表总长度的一半。
感谢 Narendra Kangralkar 提出这种方法。

C

// C program to implement the 
// above approach
#include 
#include 
  
// Link list node
struct node 
{
    int data;
    struct node* next;
};
  
// Function to get the middle of 
// the linked list
void printMiddle(struct node* head)
{
    int count = 0;
    struct node* mid = head;
  
    while (head != NULL)
    {
        // Update mid, when 'count' 
        // is odd number
        if (count & 1)
            mid = mid->next;
  
        ++count;
        head = head->next;
    }
  
    // If empty list is provided
    if (mid != NULL)
        printf("The middle element is [%d]", 
                mid->data);
}
  
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;
}
  
// A utility function to print a 
// given linked list
void printList(struct node* ptr)
{
    while (ptr != NULL) 
    {
        printf("%d->", ptr->data);
        ptr = ptr->next;
    }
    printf("NULL");
}
  
// Driver code
int main()
{
    // Start with the empty list 
    struct node* head = NULL;
    int i;
  
    for (i = 5; i > 0; i--) 
    {
        push(&head, i);
        printList(head);
        printMiddle(head);
    }
    return 0;
}

输出:

5->NULL
The middle element is [5]

4->5->NULL
The middle element is [5]

3->4->5->NULL
The middle element is [4]

2->3->4->5->NULL
The middle element is [4]

1->2->3->4->5->NULL
The middle element is [3]

有关详细信息,请参阅有关查找给定链接列表的中间的完整文章!