链表-链表反转

  1. 头插入法:
    开辟一个新链表Presult头为空,通过指针pfor遍历给定的链表, 每个node都插入到Presult头部,
    注意:
    1.1. 每次插入node时, Presult->next都会更改, 需要先保存,保证给定链表不断
    1.2. 在 Presult 头部插入后,Pfor要改为之前保存的tmp;
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if((head == NULL) || (head->next == NULL))
        {
            return head;
        }
        ListNode* presult = NULL;
        ListNode* pfor = head;
        while(pfor != NULL)
        {
            ListNode* tmp = pfor->next;            
            pfor->next = presult;
            presult = pfor;
            pfor = tmp;
        }
        head = presult;
        return head;

    }
};
  1. 就地反转:
    从第二个node开始, 每个node的next指向前一个node,
    注意: 1. 每次需要保存current的下一个节点
    2. 返回的是pre节点, current节点是NULL
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if((head == NULL) || (head->next == NULL))
        {
            return head;
        }
        ListNode* pcur = head->next;
        ListNode* ppre = head;
        ppre->next = NULL;
        while(pcur != NULL)
        {   
            ListNode* tmp = pcur->next;            
            pcur->next = ppre;
            ppre = pcur;
            pcur = tmp;
        }
        return ppre;

    }
};
  1. 递归
    递推公式:
class Solution {
public:

 ListNode* reverseList(ListNode* head) {
        if(head == NULL || head->next == NULL) {  //终止条件并不难想
            return head;
        }
        ListNode* node = reverseList(head->next);
        head->next->next = head;
        head->next = NULL;
        return node;  //按上面的例子,F(node=1)和F(node=2)它俩反转后的头节点是同一个
    }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值