zoukankan      html  css  js  c++  java
  • 剑指OFFER之反转链表(九度OJ1518)

    题目描述:

    输入一个链表,反转链表后,输出链表的所有元素。
    (hint : 请务必使用链表)

     

    输入:

    输入可能包含多个测试样例,输入以EOF结束。
    对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数。
    输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素。

     

    输出:

    对应每个测试案例,
    以此输出链表反转后的元素,如没有元素则输出NULL。

     

    样例输入:
    5
    1 2 3 4 5
    0
    样例输出:
    5 4 3 2 1
    NULL

    解题思路:

      我们考虑到,如果是想通过题目AC,可以直接以头插的方式一次输入数据,输出数据既是倒转数据。但是面试题目本意并非如此,那么如果是一个现有的链表逆转,却又不用太高的时间复杂度,和空间复杂度呢。有一种想法,既然我们一次遍历链表,那么直接改变链表指针不就行了?

      思路大致如此:

      首先,考虑到一般情况,我们翻转指针,每次利用指针p和p->next也就是p1来改变p1元素的位置,代码如下:

    Node *p = head->next;
        Node *p1 = p->next;
        while(p->next != NULL){
            p->next = p1->next;
            p1->next = head->next;
            head->next = p1;
            p1 = p->next;
        }

      但是考虑到特殊情况

      1 如果链表为空,那么根本不需要处理

        if(head->next == NULL)
            return 0;

      2 如果链表只有一个元素,那么根本不需要倒转

        if(head->next->next == NULL)
            return 1;

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    typedef struct node{
        int number;
        struct node * next;
    }Node;
    int reverseList(Node * head);
    int main(){
        int n,i;
        while(scanf("%d",&n)!=EOF && n>=0 && n <= 1000){
            Node *head = (Node *)malloc(sizeof(Node));
            head->next = NULL;
            Node *tail = head;
            for(i=0;i<n;i++){
                int temp;
                scanf("%d",&temp);
                Node *p = (Node *)malloc(sizeof(Node));
                p->next = tail->next;
                p->number = temp;
                tail->next = p;
                tail = tail->next;
            }
            int flag = reverseList(head);
            if(flag){
                Node *p = head->next;
                while(p->next != NULL){
                    printf("%d ",p->number);
                    p = p->next;
                }
                printf("%d
    ",p->number);
            }
            else
                printf("NULL
    ");
        }
        return 0;
    }
    int reverseList(Node * head){
        if(head->next == NULL)
            return 0;
        if(head->next->next == NULL)
            return 1;
        Node *p = head->next;
        Node *p1 = p->next;
        while(p->next != NULL){
            p->next = p1->next;
            p1->next = head->next;
            head->next = p1;
            p1 = p->next;
        }
        return 1;
    }
    /**************************************************************
        Problem: 1518
        User: xhalo
        Language: C
        Result: Accepted
        Time:150 ms
        Memory:2364 kb
    ****************************************************************/
  • 相关阅读:
    Navicat建表MySQL索引类型
    Feign调用全局异常处理解决
    ShardingJDBC、Mycat、drds对比
    MySQL之索引失效分析及优化相关
    SpringBoot2.X集成spring session redis实现session共享
    Redis的消息订阅/发布 Utils工具类
    MySQL索引类型区分
    handler使用(二)
    Android开发指南中文版(七)Content Providers
    Android消息处理(一)进程内通信
  • 原文地址:https://www.cnblogs.com/xing901022/p/3760080.html
Copyright © 2011-2022 走看看