链表(LinkedList)
- 单链表:链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素中的引用字段链接在一起。
- 双链表:与单链表不同的是,双链表的每个结点中都含有两个引用字段。
链表的优点如下:
- 链表能灵活地分配内存空间;
- 能在 O(1) 时间内删除或者添加元素,前提是该元素的前一个元素已知,当然也取决于是单链表还是双链表,在双链表中,如果已知该元素的后一个元素,同样可以在 O(1) 时间内删除或者添加该元素。
链表的缺点是:
- 不像数组能通过下标迅速读取元素,每次都要从链表头开始一个一个读取;
- 查询第 k 个元素需要 O(k) 时间。
示例:
给定这个链表:1->2->3->4->5
当 k=2 时,应当返回:2->1->4->3->5
当 k=3 时,应当返回:3->2->1->4->5
在翻转链表的时候,可以借助三个指针:prev、curr、next,分别代表前一个节点、当前节点和下一个节点,实现过程如下所示。
class Solution: def reverseKGroup(self, head, ListNode, k: int): l = 0 heads = ListNode(0) ans = heads ls = head while (ls != None): l = l + 1 ls = ls.next while (head != None): if l >= k: pre = head st = head for i in range(k): st = st.next new = ListNode(0) new.next = st for i in range(k): last = head.next head.next = new.next new.next = head head = last ans.next = new.next ans = pre l -= k else: ans.next = head break return heads.next