【问题标题】:Linked list with sentinel带哨兵的链表
【发布时间】:2020-11-22 13:37:17
【问题描述】:

在链表 S(sentinel)->1->2->3->4->5->6->S 的每一端都有一个带有哨兵的链表(类似这样)。我必须交换相邻元素: S->1->2->3->4->5->S 到 S->2->1->4->3->5->S 但代码改为:2->1->4->3->-842150451。此代码适用于每种输入:S->1->2->S、S->1->S 等。我必须在原始代码中建立一个新的列表连接。禁止更改节点中的整数值。我相信我的 void reverse_pairs(list* head) 函数很糟糕,但我现在不知道如何让它工作。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

typedef struct _list {
    int a;
    struct _list* next;
}list;
    

void reverse_pairs(list* head)
{
    if (head)
    {
        for (; head->next && head->next->next; head = head->next->next)
        {
            list* tmp = head->next;
            head->next = head->next->next;

            tmp->next = head->next->next;
            head->next->next = tmp;
        }
    }
}


list* makesentinel() 
{
    list* stra1 = (list *)malloc(1 * sizeof(list));
    list* stra2 = (list*)malloc(1 * sizeof(list));
    stra1->next = stra2;
    stra2->next = NULL;
    return stra1;
}
void push(list* head_ref, int new_data)
{
    list* new_list = (list*)malloc(sizeof(list));
    new_list->a = new_data;
    new_list->next = head_ref->next;
    head_ref->next = new_list;
}
void print(struct _list* node)
{
    list* temp = NULL;
    temp = node->next;
    while (temp->next != NULL) {
        printf("%d ", temp->a);
        temp = temp->next;
    }
}

int main()
{
    list* start = NULL;
    start = makesentinel();
    push(start, 5);
    push(start, 4);
    push(start, 3);
     push(start, 2);
     push(start, 1);

    printf("before\n");
    print(start);

    reverse_pairs(start);

    printf("\nafter\n");
    print(start);

    return 0;
}

【问题讨论】:

    标签: c pointers linked-list sentinel


    【解决方案1】:

    您的问题是您从不测试最后一对是否完整。如果您的链表包含偶数个元素,则您的代码可以正常工作(只需尝试添加 push(start, 6);)。

    所以你必须在reverse_pairs进一步测试:

    void reverse_pairs(list* head)
    {
        if (head)
        {
            for (; head->next && head->next->next && head->next->next->next; head = head->next->next)
            {
                ...
    

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      相关资源
      最近更新 更多