c - 使用气泡排序旋转链表



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

可能像下面的过程。(未经测试的伪代码(

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);
    }
}

以下是所需的代码截图,它将执行所需的操作。您可以在此处查看完整的工作。代码中的函数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;
}

相关内容

  • 没有找到相关文章

最新更新