单链表的逆序

今天看面试题目系列二时,碰到了这么一个题目。刚开始的想了下,以为会跟字符串逆转类似,所以动手写ReverseList的时候就把它当成字符串逆转处理了。完了后发现是根本不能这么处理,因为字符串指向最后字符的指针pend可以通过pend--来往前进行访问,但是单链表最后的结点却不能这样向前访问,所以这个想法错误了!!!

后面看了下答案,才知道可以通过指针的操作完成,十分惭愧!!!所以决定记下来,而且这段时间很忙,博客都没更新过了……

正确方法是定义三个指针,p1 = head;p2 = p1->next;p3 = p2->next;而后令p1->next = NULL,因为逆转后原来的head结点称为最后一个结点了,再循环判断,条件是p3 != NULL;如果条件满足,可将p2指向p1:p2->next = p1;然后p1,p2,p3分别前移一个结点……如此循环,直到p3 = NULL;循环终止,但这时候p1和p2的结点没有逆序所以再将p2->next = p1;到这为止则完成整个单链表的逆序了。

源代码如下:

#include <stdio.h>
#include <malloc.h>

struct Node{
    int data;
    Node *next;
};

typedef struct Node Node;

Node *ReverseList(Node *head)
{
    if(head == NULL || head->next == NULL)
        return head;
    Node *p1 = head;
    Node *p2 = p1->next;
    Node *p3 = p2->next;
    
    p1->next = NULL;
    while(p3 != NULL)
    {
        p2->next = p1;
        p1 = p2;
        p2 = p3;
        p3 = p3->next;
    }
    p2->next = p1;
    head = p2;
    return head;
}

int main()
{
    Node *head = NULL;
    Node *node1 = NULL,*node2 = NULL,*node3 = NULL,*node4 = NULL;
    head = (Node *)malloc(sizeof(Node));
    node1 = (Node *)malloc(sizeof(Node));
    node2 = (Node *)malloc(sizeof(Node));
    node3 = (Node *)malloc(sizeof(Node));
    node4 = (Node *)malloc(sizeof(Node));
    
    node1->data = 1;
    node2->data = 2;
    node3->data = 3;
    node4->data = 4;
    head->next = node1;
    node1->next = node2;
    node2->next = node3;
    node3->next = node4;
    node4->next = NULL;

    Node *ptr;
    ptr = ReverseList(head);
    while(ptr->next != NULL)
    {
        printf("%d ",ptr->data);
        ptr = ptr->next;
    }
    printf("/n");
    return 0;
}

你可能感兴趣的:(struct,面试,null)