反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
这个题看起来简单,但是想起来还是得一些小技巧,可能最近脑子不太灵光,这个题竟然想了很久。。。。首先肯定是要用两种方法的,递归法要注意的就是一方面最后返回的节点是头节点,所以不能变,只能有一个变量表示头节点,然后中间的话由于要从最后来往回执行,所以一定是要保存一下当前节点的,而且链表可以改变指向,因此从最后往回推那就应该是返回了头节点,而倒数第二个节点在倒数第二次递归中保存了下来,所以改变其指向就可以。
C++源代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head==NULL || head->next==NULL)
return head;
ListNode *p = head;
head = reverseList(p->next);
p->next->next = p;
p->next=NULL;
return head;
}
};
注意这个递归程序返回了head,这个head是头节点,所以返回之后就不可以再动了,其余操作都是由于后面的节点指向发生了变化所以可以直接进行操作。
迭代法就是在前面设置一个空节点,然后不断循环往中间插就可以。
python3源程序:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head==None:
return head
preHead = ListNode(0)
preHead.next = head
p = preHead
while head.next:
tmp = head.next
head.next = tmp.next
tmp.next = preHead.next
preHead.next = tmp
return preHead.next