列表

详情


OR152. 每K个一组反转链表

描述

给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。

说明:
1. 你需要自行定义链表结构,将输入的数据保存到你的链表中;
2. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换;
3. 你的算法只能使用常数的额外空间。

输入描述

第一行输入是链表的值
第二行输入是K的值,K是大于或等于1的整数

输入形式为:
1 2 3 4 5
2

输出描述

当 k = 2 时,应当输出:
2 1 4 3 5

当 k = 3 时,应当输出:
3 2 1 4 5

当k=6时,应当输出:
1 2 3 4 5

示例1

输入:

1 2 3 4 5
2

输出:

2 1 4 3 5

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 248KB, 提交时间: 2019-10-20

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

typedef struct Node{
    int num;
    struct Node *next;
}Node;

int main(){
    Node *head, *tail;
    head = tail = NULL;
    int n;
    int k;
    while(1){
        scanf("%d", &n);
        Node *node = malloc(sizeof(Node));
        node->num = n;
        node->next = NULL;
        if(head == NULL){
            head = tail = node;
        }
        else{
            tail->next = node;
            tail = node;
        }
        if(getchar() == '\n'){
            break;
        }
    }
    scanf("%d", &k);
    
    Node *pLeft, *pRight;
    pLeft = pRight = NULL;
    Node *p1, *p2;
    p1 = p2 = head;
    while(1){//
        int i = 0;
        while(p2 != NULL && i < k-1){
            p2 = p2->next;
            i++;
        }
        if(p2 == NULL){ //如果剩余部分长度小于k,则不翻转
            break;
        }
        pRight = p2->next;
        //创建一个临时链表,对p1至p2部分进行翻转
        Node *headtmp, *tailtmp;
        headtmp = tailtmp = NULL;
        Node *tmp_del; //用于删除节点保存元素下一指针的临时变量
        while(p1 != p2->next){
            Node *tmpnode = malloc(sizeof(Node));
            tmpnode->num = p1->num;
            if(headtmp == NULL){
                headtmp = tmpnode;
                tailtmp = tmpnode;
            }
            else{
                tmpnode->next = headtmp;
                headtmp = tmpnode;
            }
            tmp_del = p1->next;
            free(p1);
            p1 = tmp_del;
        }
        
        //链接翻转部分
        if(pLeft != NULL){
            pLeft->next = headtmp;
        }
        else{
            head = headtmp;
        }
        tailtmp->next = pRight;
        pLeft = tailtmp;
        p1 = p2 = pRight;
    }
    Node *tmp = head;
    while(tmp != NULL){
        printf("%d ", tmp->num);
        tmp = tmp->next;
    }
}

C 解法, 执行用时: 2ms, 内存消耗: 296KB, 提交时间: 2019-12-23

#include <stdio.h>
#include <stdlib.h>
typedef struct node {
    int val;
    struct node* next;       
} Node;

Node* revertList(Node* head, int k) 
{
    //Node* next = head->next;
    Node* cur;
    Node* pre;
    Node* pos;
    //Node* pre = head; 
    if (k == 1) {
        return head;
    } else if (k == 2) {
        head->next->next = head;
        return head->next;
    }
    //pre = head;
    //cur = head//head->next;
    //next = cur->next;
    cur = head->next;
    pre = head;
    for (int i = 0; i < k-1; i++) {
        pos = cur->next;
        cur->next = pre;
        pre = cur;
        cur = pos;        
    }
    return pre;
}

int main() 
{
    int n, k;
    Node* head;
    Node* tempTail;
    Node* tempHead;
    Node* revertHead;
    Node* tail;
    //Node* head;
    head = NULL;
    
    revertHead = NULL;
    Node* temp;
    int count, i; 
    // create link list
    while (1) {
        scanf("%d", &n);
        temp = (Node*)malloc(sizeof(Node));
        if (temp == NULL) {
            return -1;
        }
        temp->val = n;
        temp->next = NULL;
        
        if (head == NULL) {
            head = temp;
            tail = temp;
        } else {
            tail->next = temp;
            tail = tail->next;
        }   
        
        if (getchar() == '\n') {
            break;
        }        
    }
    
    scanf("%d", &k);
    
    // revert list local k
    //segHead = head;
    tempHead = head;
    //tempHead = head;
    tempTail = (Node*)malloc(sizeof(Node));
    revertHead = tempTail;
    temp = head;
    while (temp != NULL) {
        i = 0;
        while ((temp != NULL) && (i < k - 1)) {
            temp = temp->next;
            i++;
        }
        
        if (temp == NULL) {
            tempTail->next = tempHead;
            break;
        } else {    
            temp = temp->next;
            tempTail->next = revertList(tempHead, k);
            tempHead->next = NULL;
            tempTail = tempHead;
            tempHead = temp;
        }
        
    }
    
    for (temp = revertHead->next; temp != NULL; temp = temp->next) {
        printf("%d ", temp->val);        
    }
    
    free(revertHead);
    revertHead = NULL;
}
 

上一题