描述
Reverse a singly linked list
例子
思路
因为要反转,所以就会断了当前结点和下一个结点的本来关系,所以要保留下一个结点xia
- 方法1
遍历链表,对于每个结点,先保留下一个结点的位置,然后采用头插法,将该结点插入新的链表,修改当前结点
时刻保存当前结点
- 方法2
遍历链表,对于每个结点,先保留下一个结点,然后,将head指向pre,修改pre和head
时刻保存前一个结点和当前结点
- 递归
答案 - java
public ListNode reverseList(ListNode head) {
ListNode hhead = new ListNode(-1);
while(head!=null){
ListNode temp = head.next;
head.next = hhead.next;
hhead.next = head;
head=temp;
}
return hhead.next;
}
- python
**方法1 头插法**
h=ListNode(0)
xia=None
while head:
xia = head.next
head.next = h.next
h.next = head
head = xia
return h.next
**方法2**
def reverseList(self, head: ListNode) -> ListNode:
pre =None
while head:
xia = head.next
head.next = pre
pre = head
head = xia
return pre
*递归*
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
hou = self.reverseList(head.next)
head.next.next = head
head.next=None
return hou
- c++
**方法1 头插法**
ListNode* h = new ListNode(0);
ListNode* xia = NULL;
while (head)
{
//保留下一个结点的位置,便于更替head
xia = head->next;
//采用头插法插入当前结点
head->next=h->next;
h->next = head;
//向前滑,更改head
head=xia;
}
return h->next;
**方法2**
ListNode* reverseList(ListNode* head) {
ListNode* pre = NULL;//时刻保存前一个结点,和当前结点,即要当前结点要反接谁
ListNode* xia = NULL;
while(head)
{
//保留下一个结点的位置,便于更替head
xia = head->next;
//反转该结点,将该结点指向前一个结点
head->next = pre;
//更改,向后滑,保存pre和当前结点
pre = head;
head = xia;
}
return pre;
*递归*
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (!head || !head->next)
return head;
ListNode* hou = reverseList(head->next);
head->next->next=head;
head->next=NULL;
return hou;
}
};