【问题标题】:Rotate linked list using bubble sort使用冒泡排序旋转链表
【发布时间】:2017-06-14 08:50:54
【问题描述】:

我正在尝试编写一个函数,该函数将用于以这种方式旋转链表:1 -> 2 -> 3 -> 4,如果用户选择要向前移动 3 个节点的第一个节点,它将转到是:2->3->1->4->END(在两个节点之间切换,直到它到达第三个节点,在我看来就像冒泡排序)。另一个例子:如果用户选择第二个节点作为第一个节点,它将看起来像这样:2->1->3->4->END。

【问题讨论】:

  • 这不是排序,这只是简单的节点交换位置。您通常通过重新分配要移动的节点的指针来为列表执行此操作。
  • @Someprogrammerdude 支持您的评论,链表可以以这样一种方式实现,即它们的头部和尾部具有人工附加节点,以便在涉及节点之一的情况下消除交换中的边缘情况是在开头还是结尾。
  • 我不认为它与任何排序算法有关。您认为应该为链接列表输出的内容:3->1->7->10->5->12->8->END,如果我选择将元素 7 移动 2。
  • @Saga 不,我的意思是将第三个元素 (7) 移动 2 步。
  • @Saga 是的!因此,如果我们将第 3 个元素(7)移动 2 步,则列表将是 3->1->10->5->7->12->8->END。这是正常的换档。我的观点是:这与任何排序算法有关。因为如果我们在这个列表上执行任何sorting 算法(例如bubble sort),那么输出将会不同(在这种情况下,第一次迭代后输出将是1->3->7->5->10->8->12->END)。

标签: c linked-list bubble-sort


【解决方案1】:

大概像下面这个过程。 (未经测试的伪代码)

void rotateLeftOne(Node *np, int rotateLength){
    if(np == NULL || np->next == NULL)
        return;
    assert(rotateLength <= listLength(np));
    for(int i = 1; i < rotateLength && np->next; ++i, np = np->next){
        swap(&np->value, &np->next->value);
    }
}

【讨论】:

    【解决方案2】:

    以下是所需的代码片段,它将执行所需的操作。你可以see the complete working here。代码中的函数void shiftNode(Node** rootNode, int nodeIndex, int shifts)将节点移动到所需位置:

    typedef struct N
    {
        int val;
        struct N* next;
    }Node;
    
    /** Index starts from 0*/
    void shiftNode(Node** rootNode, int nodeIndex, int shifts)
    {
        int i=1;
        Node *pNode, *temp, *root = *rootNode;
        if((shifts <= 0) || (nodeIndex < 0))
        {
            return;
        }
    
        if(nodeIndex != 0)
        {
            for(i=1; i<nodeIndex; i++)
            {
                root = root->next;
            }
            pNode = root->next;
            root->next = pNode->next;
        }
        else
        {
            *rootNode = root->next;
            pNode = root;
            root->next = pNode->next;
        }
    
        for(i=0; i<shifts; i++)
        {
            root = root->next;
        }
        temp=root->next;
        root->next = pNode;
        pNode->next=temp;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 2015-08-20
      • 2012-09-29
      • 1970-01-01
      相关资源
      最近更新 更多