反转单链表

假设单链表的数据结构定义如下:

typdef struct LNode {
    int data;
    struct LNode *next;
}LNode, *LinkedList;

单链表有一个头指针list指向第一个节点,最后一个节点指向NULL

解法1:新建单链表

LinkedList ReverseSingglyLinkedList(LinkedList list) {

    LinkedList newList;//新建表的头结点
    LNode *tmp;//指向list的第一个节点,也就是要摘除的结点
    
    //增加代码健壮性
    if(list == NULL || (newList = (LinkedList)malloc(sizeof(LNode))) == NULL) {
        return NULL;
    }
    
    //初始化newList
    newList->data = list->data;
    newList->next = NULL;
    
    while(list->next != NULL) {
        tmp = newList->next;//保存后继节点
        newList->next = list->next;//将list的第一个节点放到newList中
        list->next = list->next->next;//从list中摘除这个结点
        newList->next->next = tmp;//活肤newList中的后续结点指针
    }
    
    //释放原头结点,返回新头结点
    free(list);
    return newList;
}

 

解法2:修改next指针指向的结点,header->2->1->3->4+header->3->2->1->4......

LinkedList ReverseSinglyLinkedList(LinkedList list) {
    LNode *tmp = NULL;
    LNode *p = NULL;
    
    if(list == NULL) {
        return NULL;
    }
    
    tmp = list->next;
    while(tmp->next != NULL) {
        p = tmp->next;
        tmp->next = p->next;
        p->next = list->next;
        list->next = p;
    }
    
    return list;
}
posted @ 2017-11-01 15:02  ooooooook  阅读(223)  评论(0)    收藏  举报