• 剑指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
    ****************************************************************/
  • 相关阅读:
    淘淘商城项目分析报告
    LDAP入门
    spring APO的简单理解
    MySQL数据库的导入导出
    servlet CDI
    Result 架构
    java的设计模型
    JavaEE人力资源管理系统测试报告——许珍源、朱国辉小组
    部分代码片段——人力资源管理系统
    期末项目——人力资源管理系统需求分析
  • 原文地址:https://www.cnblogs.com/xing901022/p/3760080.html
Copyright © 2020-2023  润新知