1. 题目
剑指 Offer 24. 反转链表:
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
2. 思路
解题思路参考:
206. 反转链表
-
双指针做法
定义两个指针: pre 和 cur;pre为null,cur等于head。
每次让 cur 的 next 指向 pre ,实现一次局部反转
局部反转完成之后, cur赋值给pre, cur 往前移动一个位置
循环上述过程,直至 pre到达链表尾部 -
遍历链表,节点值放到栈中,栈中元素出栈,赋值到新的链表中
3. 程序
- 双指针做法
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
pre = None
cur = head
while cur:
temp = cur.next
cur.next = pre
pre= cur
cur = temp
return pre
- 遍历每个节点,存放在栈中,栈弹出元素到新的链表中(插头节点插入链表)
# 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:
stack = []
while head:
stack.append( head.val)
head = head.next
node = ListNode(0)
tm = node
while stack:
tm.next = ListNode(stack.pop())
tm = tm.next
return node.next
4. 总结
- 链表双指针的使用,一前一后,如何理清逻辑思路
- 链表和数组、栈的搭配使用
- 剑指offer中的头节点或者头指针都是直接指向第一个元素