面试题24.反转链表
题目
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
比如:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
P.S.题目来源于leetcode
解题思路
1.借助辅助栈+新链表
先用栈保存原链表的值。
新链表的值取自栈中。
code1:辅助栈
### 辅助栈+新链表
# 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:
#一个简单思路:维护一个新的链表结构,链表的值从栈中取出
#特判
if not head or not head.next: return head
#维护一个链表和栈
stack = []
newGuard = ListNode(None)#新的链表的哨兵节点
curNew = newGuard
cur = head#原始链表的当前节点
stack.append(head.val)
while cur.next:#填装栈
cur = cur.next
stack.append(cur.val)
while stack:#填装新链表
curNew.next = ListNode(stack.pop())#更新当前节点的next
curNew = curNew.next #更新当前节点
return newGuard.next
或者不用辅助栈,但需要新链表:
# 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:
if not head: return head
pre = None
cur = head
cnt = 0
while cur:
cnt+=1
tmp = ListNode(cur.val)
tmp.next = pre
pre = tmp
print(pre.val)
cur = cur.next
print(cnt)
return pre
2.双指针+辅助变量
引入一个辅助节点引用pre,tmp.
pre保存上一个节点,初始为None;
tmp作为当前节点的备份,用以进入下一节点。
再循环的过程中不断的修改cur.next。
修改完cur.next,更新pre和cur。
最后的pre即为结果。
核心:
while cur :#是cur(到最后一个节点)还是cur.next(倒数第二节点)取决于循环中是否有cur=cur.next(这只能到倒数第二节点)
tmp = cur.next#保存cur.next,用于进入下一节点
cur.next = pre
pre = cur #更新pre和cur
cur = tmp
code2
####双指针
# 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:
#一个简单思路:使用双指针方法
#if not (head and head.next):return head
pre = None#保存上一个值
cur = head
while cur :#是cur(到最后一个节点)还是cur.next(倒数第二节点)取决于循环中是否有cur=cur.next(这只能到倒数第二节点)
tmp = cur.next
cur.next = pre
pre = cur #更新pre和cur
cur = tmp
return pre