我正在尝试编写一个函数,该函数将用于以这种方式旋转链表: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;
}