LeetCode206.反转链表

反转一个链表

  • 示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

  • 思路一
    使用三个指针,pcur一个指针指向当前节点,pre一个指向当前节点的前一个节点,pnext一个指向当前节点的下一个节点,
    首先将pre = NULL。
    让pnext指向pcur的next,然后断开之前的,让pcur指向pre,然后让pre和pcur向后移动,重复进行这一操作
struct ListNode* reverseList(struct ListNode* head){
    struct ListNode *pcur, *pre = NULL;
    struct ListNode *pnext;
    if(!head) {
        return head;
    }
	pcur = head;
	while(pcur) {
        pnext = pcur->next;
		pcur->next = pre;
        pre = pcur;
		pcur = pnext;
	}
    return pre;
}

输入: 1,2,3,4,5
输出: 5,4,3,2,1

  • 思路二
    使用递归的思想,有一个需要注意的地方,当head的next为null时,可能会一直进行循环,所以要进行判断。
    假设,有m个节点,第n+1到m个已经进行了反转了,也就是,第n+2个节点的next指向的时第n+1个节点,此时,应该让第n个节点的下一个的下一个,也就是让n+1的next指向第n个节点,即,pn->next->next = pn;然后让第n个节点的next指向空null;
struct ListNode* reverseList(struct ListNode* head){
 
	struct ListNode *next = NULL;
	if(head == NULL || head->next == NULL) {
		return head;
	} else {
		struct ListNode *p = reverseList(head->next);
        head->next->next = head;
		head->next = NULL;
        return p;
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值