题目来自LeetCode,链接:面试题24. 反转链表。具体描述为:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
还是用两个指针prev和latter分别指向前后节点(分别初始化为head
和head.next
),把后节点的next
指向前节点(latter.next=prev
)就能完成反转,然后两个指针都后移到原先未反转之前的下一个节点,一直到后指针latter
为空为止,具体细节还是得看代码 。时间复杂度为
O
(
n
)
O(n)
O(n),空间复杂度为
O
(
1
)
O(1)
O(1)。
JAVA版代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null) {
return head;
}
ListNode prev = head;
ListNode latter = head.next;
head.next = null;
while (latter != null) {
ListNode tmp = latter.next;
latter.next = prev;
prev = latter;
latter = tmp;
}
return prev;
}
}
提交结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/f1142630ced7117b4df8b3216a57f704.png)
Python版代码如下:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
prev = head
for i in range(k):
head = head.next
while head is not None:
head = head.next
prev = prev.next
return prev
提交结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/a81f0c69feaa89cd9f5a0434f147bcd9.png)