单链表部分逆置

题目描述如下:
这里写图片描述

该程序最关键的地方在于reverse函数,这里使用了两种实现方式,分别采用了数组(reverse())及指针(reverse2())的方式,具体实现代码如下。

#include <iostream>
using namespace std;

struct List
{
    int num;
    List *next;
};

List *head;

// 数组实现,时间复杂度和空间复杂度都为O(n)
void reverse(int begin, int end, List *&head)
{
    //在这个函数中编写你的代码
    if (begin <= end && begin < 10 && end < 10) {
        int i = end - begin + 1;
        //int* arr = (int*)malloc(i * sizeof(int));
        int *arr = new int[i];//动态定义数组
        List *p = head, *q;
        for (int j = 0; j < begin; j++) 
            p = p->next;
        q = p;
        for (int j = 0; j < i; j++) {//复制
            arr[j] = p->num;
            p = p->next;
        }
        for (int j = i - 1; j > -1; j--) {
            q->num = arr[j];
            q = q->next;
        }
    }
}

// 指针实现,时间复杂度为O(n),空间复杂度为O(1) 
void reverse2(int begin, int end , List *& head) {
    if (begin <= end && begin < 10 && end < 10) {
        List *p = head, *q, *r, *s, *t;
        for (int i = 1; i < begin; i++) 
                p = p->next;
        q = p;
        r = q->next;
        t = r;
        s = r->next;
        // 修改指针,转置 
        for (int i = 0; i <= end-begin; i++) {
            r->next = q;
            q = r;
            r = s;
            s = s->next;
        }
        p->next = q;
        t->next = r;
    }
}

List *Create()
{
    List *p = NULL;
    List *q = NULL;
    head = NULL;
    for ( int i = 0; i < 10; i++ ) {
        p = new List;
        p->num = i * 2;
        if ( head == NULL ) {
            head = p;
        }
        else {
            q->next = p;
        }
        q = p;
    }

    if ( head != NULL ) {
        q->next = NULL;
    }

    return head;
}

void displayList(List *head)
{
    while ( head != NULL ) {
        cout << head->num;
        head = head->next;
        if ( head != NULL ) {
            cout << "->";
        }
    }
    cout << endl;
}

int main() {
    Create();
    int begin, end;
    cin >> begin >> end;
    reverse(begin, end, head);
    displayList(head);
    return 0;
}

关于整个链表的逆置可参考:
http://blog.csdn.net/thefutureisour/article/details/8193036

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值