206. Reverse Linked List
Reverse a singly linked list.
Hint:
A linked list can be reversed either iteratively or recursively. Could you implement both?
206.倒置一个链表
倒置一个单链表
点击显示更多提示
提示:
倒置一个链表要么用迭代要么用递归。你能两种都实现吗?
思路:单链表的倒置其实就是将结点的next值改变,使其原来指向下家忽然变成指向上家,那这一过程中必然会涉及到三个结点:当前结点、下家结点、上家结点。所以简单的想法即是设置三个游走指针,使其三个紧紧挨着,在单链表上游动,不断改变中间那个指针指向的结点的next值,游到最后时链表就倒置了。类似的还可以理解成循环取出原链表的头结点,将其插入到新的空链表头部。
如果不用迭代而用递归的方式解决此问题,分析起来差不多。调用自身函数获得除当前头结点外的倒置后的链表,然后把当前这个头结点插入到倒置后的链表的尾部。此方法耗时较多,下面就给出迭代的程序。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *pre, *cur, *post;
pre = NULL;
cur = head;
post = head;
while (post){
post = post->next;
cur->next = pre;
pre = cur;
cur = post;
}
return pre;
}
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
pre, cur, post = None, head, head
while post:
post = post.next
cur.next = pre
pre = cur
cur = post
return pre