单向链表移动

给定一个单链表,旋转链表,将链表每个节点向后移动 k 个位置,
如果是尾节点,则把它移动到最前面;其中 k 是正数。
要求:时间复杂度O(n),空间复杂度O(1)
例如:

输入: 1->2->3->4->5->NULL, k = 1 输出: 5->1->2->3->4->NULL

输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL

输入: 1->2->3->4->5->NULL, k = 3 输出: 3->4->5->1->2->NULL

输入: 1->2->3->4->5->NULL, k = 6 输出: 5->1->2->3->4->NULL

typedef struct node {
    int value;
    struct node *next;
} LinkNode;

// 创建链表
- (void)creatLinkList
{
    LinkNode *trail = NULL;
    LinkNode *head = NULL;
    // 创建单向链表
    for (int i = 0; i < 7; i++) {
        LinkNode *newNode = malloc(sizeof(LinkNode));
        newNode->value = i+1;
        newNode->next = NULL;
        if (!head) {
            trail = newNode;
            head = newNode;
        }
        trail->next = newNode;
        trail = newNode;
    }

    LinkNode *p = reverList(head, trail, 7, 8);
    while(p != NULL) {
        printf("\t %d", p->value);
        p = p->next;
    }
}


LinkNode *reverList(LinkNode *head, LinkNode *trail, int lengh, int k)
{
    if (k > lengh)  k %= lengh;
    if (k % lengh == 0)  return head;

    LinkNode *newTrail = NULL, *p = head;
    LinkNode *newHead = p;
    int newHeadIndex = lengh - k;
    while (p && p->value <= newHeadIndex) {
        newTrail = p;
        newHead = p;
        p = p->next;
    }
    newHead = newTrail->next;
    
    trail->next = head;
    newTrail->next = NULL;
    
    
    return newHead;
}

另外思路:可以将原单链表转成循环链表,找到新的头尾指针,断开为指针,返回头指针。其实跟上面的复杂度也一模一样,只是将代码trail->next = head;挪到if语句之后即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容