链表 206.反转链表
题目
反转一个单链表。
示例
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
思路
首先看到这道题的话,我第一个会想到的方法是创建一个新的头结点,把老的链表使用头插法,复制过去,这样就形成了一条新的倒序链表。有没有再简单的方法呢?再者的话,就是使用临时的指针,通过迭代的方式来实现。
如1->2->3->4->5->NULL,当2的next指针指向1,2就忘记了它下一个节点是谁?那就麻烦了,必定要用到临时指针来保存3的地址,故使用temp来指向当前节点的下一个节点,用new_node来指向当前节点的上一个节点,head为当前节点。
1(new_node) -> 2(head) -> 3(temp) -> 4 -> 5 -> NULL
temp = head->next;
head->next = new_node;
new_node = head;
head = temp;
1 <- 2(new_node) <- 3(temp,head) -> 4 -> 5 -> NULL
递归的思路比较难,暂时还不知道怎么解释(留着)。
代码实现
1、迭代
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *new_node = NULL,*temp = head;
while( head != NULL )
{
temp = head->next;
head->next = new_node;
new_node = head;
head = temp;
}
return new_node;
}
2、递归
struct ListNode* reverseList(struct ListNode* head){ //如果链表为空或者只有一个节点,那么就是本身 if( head == NULL || head->next == NULL ) { return head; } //获得head->next之后的翻转链表的头结点 struct ListNode *res = reverseList( head->next ); //head->next->next为翻转链表的尾部,指向当前节点 head->next->next = head; //当前节点的尾部指向空 head->next = NULL; //返回翻转链表的头结点 return res; }
纸上得来终觉浅,绝知此事要躬行