剑指offer:反转链表

题目描述

输入一个链表,反转链表后,输出链表的所有元素。

1.非递归

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
 
        if (pHead == NULL){
            return NULL;
        }
 
        ListNode* ppre = NULL;
        ListNode* p = pHead;
        ListNode* pnext = NULL;
 
        while (p != NULL){
             
            //可以整合在一起
            pnext = p->next;
            p->next = ppre;
            ppre = p;
            p = pnext;
             
            /*
            if (p == pHead){
                pnext = p->next;
                p->next = NULL;
                ppre = p;
            }
            else{
                pnext = p->next;
                p->next = ppre;
                ppre = p;
            }
            p = pnext;*/
             
        }
 
        return ppre;
    }
};

2.递归

  递归的实现方式主要有4步:

    1)如果head为空,或者只有head这一个节点,return head即可;

    2)先遍历head->next为首的链表,得到一个头结点newHead;

    3)把head赋值给head->next->next, head->next为空;

    4)返回newHead。


    下图也说明了上述步骤:

剑指offer:反转链表_第1张图片


/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
 
        if (pHead == NULL || pHead->next==NULL){
            return pHead;
        }
        else{
            ListNode * newHead = ReverseList(pHead->next);
            pHead->next->next = pHead;
            pHead->next = NULL;
            return newHead;
        }
         
    }
};


类似题目

 

92. Reverse Linked List II


递归部分参考

http://blog.csdn.net/puqutogether/article/details/45487797



你可能感兴趣的:(编程艺术,二)