**
以下为C++版本
**
已知链表头节点指针head,将链表逆序。(不可申请额外空间)
#include<stdio.h>
struct ListNode
{
int val; //数据域
ListNode* next; //指针域
ListNode(int x): val(x),next(NULL){} //构造函数
};
class Solution
{
public:
Solution() {}
~Solution() {}
ListNode* reverseList(ListNode* head)
{
//metohd-1
ListNode* new_head = NULL; //指向新链表头节点的指针
while (head)
{
ListNode* next = head->next; //备份head->next
head->next = new_head; //更新head->next
new_head = head; //移动new_head
head = next; //遍历链表
}
return new_head; //返回新链表头节点
//method-2 Recursive Solution, Time:O(n) and Space: O(n)
/*
if (head == nullptr || head->next == nullptr) {
return head;
}
ListNode* p = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return p;
*/
}
};
int main()
{
ListNode a(1);
ListNode b(2); //将节点简单的链接,进行测试
ListNode c(3); //无需构造复杂的链表操作(插入、删除)
ListNode d(4);
ListNode e(5);
a.next = &b;
b.next = &c;
c.next = &d;
d.next = &e;
Solution solve;
ListNode* head = &a;
printf("Before reverse:\n");
while (head)
{
printf("%d\n", head->val);
head = head->next;
}
head = solve.reverseList(&a);
printf("After reverse:\n");
while (head)
{
printf("%d\n", head->val);
head = head->next;
}
return 0;
}
运行结果
Before reverse:
1
2
3
4
5
After reverse:
5
4
3
2
1
**
以下为Python版本
**输入一个链表,反转链表后,输出新链表的表头
# -*-coding:utf-8-*-
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def ReverseList(self, pHead):
if pHead == None:
return None
if pHead.next == None:
return pHead
leftPointer = pHead
midPointer = pHead.next
rightPointer = pHead.next.next
leftPointer.next = None
while rightPointer != None:
midPointer.next = leftPointer
leftPointer = midPointer
midPointer = rightPointer
rightPointer = rightPointer.next
midPointer.next = leftPointer
return midPointer
if __name__ == '__main__':
l1 = ListNode(1)
l2 = ListNode(2)
l3 = ListNode(3)
l4 = ListNode(4)
l5 = ListNode(5)
l1.next = l2
l2.next = l3
l3.next = l4
l4.next = l5
s = Solution()
r1=s.ReverseList(l1)
while r1:
print(r1.val)
r1=r1.next
运行结果为:
5
4
3
2
1