链表逆序
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-linked-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1.双指针迭代法
已知链表头结点指针 head,将链表逆序。(不可以申请额外的空间)
给出链表的节点:
struct ListNode {
int val;
ListNode *next;
// 构造函数
ListNode(int x) : val(x), next(NULL) {}
};
C++解法 1:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *new_head = NULL;
while(head){
ListNode *next = head->next;
head->next = new_head;
new_head = head;
head = next;
}
return new_head;
}
};
首先保存头结点的下一个节点 next,
然后将旧链表的头节点指向新链表的头结点,
然后将新链表的头节点指向旧链表的头节点(因为旧链表的头节点此时已经成为了新链表的新的头结点)
最后将头结点指向 next(向后移动)
Python3 实现:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
new = None
while head is not None:
nextEl = head.next
head.next = new
new = head
head = nextEl
return new
2.递归
此方法的思想类似上面的思想,只不过需要放置环路存在。
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
start = self.reverseList(head.next)
head.next.next = head
head.next = None
return start