反转链表
题目:
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
示例:
输入:{1,2,3}
返回值:{3,2,1}
输入:{}
返回值:{}
说明:空链表则输出空
方法:
递归
思路:
先找到链表最后一个节点,从最后一个节点开始处理依次翻转整个链表。
首先pHead指针向后移动到底,并且设置一个新的指针newhead作为翻转后的链表的头。由于整个链表翻转之后的头就是最后一个数,所以整个过程newhead指针一直指向存放在最后一个节点的地址空间。
然后pHead指针逐层返回的时候依次将pHead指向的地址赋值给pHead->next->next指针,并且一定要记得让pHead->next =NULL,也就是断开现在指针的链接,否则新的链表形成了环,下一层pHead->next->next赋值的时候会覆盖后续的值。
如上所述依次递归完成反转。
代码示例:
```/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
/**
 * 
 * @param pHead ListNode类 
 * @return ListNode类
 */
struct ListNode* ReverseList(struct ListNode* pHead ) {
    // write code here
    if(pHead==NULL||pHead->next==NULL){
        return pHead;
    }
    //遍历到链表尾部
    struct ListNode* newhead = ReverseList(pHead->next);
    //反转
    pHead->next->next=pHead;
    pHead->next=NULL;
    return newhead;
}

京公网安备 11010502036488号