反转一个链表
- 示例:
输入: 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;
}
}