Linked list study guide

1. Linked List traversal&Reverse Linked List

This type of questions normally needs prev variable in order to remove certain nodes or reverse linked list

	dummy = ListNode()
    dummy.next = head
	prev = dummy
	while head:
		if hashmap[head.val] > 1:
			prev.next = head.next
		else:
			prev = head
		head = head.next
	return dummy.next
	prev = None 
	while head:
		next = head.next
		head.next = prev
		prev = head
		head = next
	return prev

1290. Convert Binary Number in a Linked List to Integer
206. Reverse Linked List
2046. Sort Linked List Already Sorted Using Absolute Values
160. Intersection of Two Linked Lists
1265. Print Immutable Linked List in Reverse
2181. Merge Nodes in Between Zeros
1669. Merge In Between Linked Lists
92. Reverse Linked List II

369. Plus One Linked List

1.  find the rightmost not-nine digit
2.  increase this rightmost not-nine digit by 1
3.  set all the following nines to zeros

445. Add Two Numbers II

382. Linked List Random Node
817. Linked List Components
2058. Find the Minimum and Maximum Number of Nodes Between Critical Points
19. Remove Nth Node From End of List
61. Rotate List
2487. Remove Nodes From Linked List
725. Split Linked List in Parts

2. Fast slow pointer

fast_pointer = head
slow_pointer = head
while fast_pointer or fast_pointer.next:
	fast_pointer = fast_pointer.next.next
	slow_pointer = slow_pointer
快慢指针主要用来找到链表的中间点, 如果链表的长度是奇数时,慢指针最终指向链表的中间点, 如果链表的长度是偶数时,慢指针最终指向第(n/2 + 1) 个点(例如链表长度是4,慢指针最终指向第三个点)
判断链表是否有环也可以使用快慢指针。 如果有环, 则快指针与慢指针最终会相遇。

2130. Maximum Twin Sum of a Linked List
234. Palindrome Linked List

876. Middle of the Linked List
141. Linked List Cycle

2095. Delete the Middle Node of a Linked List
24. Swap Nodes in Pairs
142. Linked List Cycle II

3. Two pointers

遇到two pointer 的题, 如果从前后双指针,可以先使用快慢指针确定中间节点, 然后翻转后半段链表。这样就可以前后同时进行遍历了

143. Reorder List

21. Merge Two Sorted Lists
328. Odd Even Linked List
1634. Add Two Polynomials Represented as Linked Lists
86. Partition List
2. Add Two Numbers

4. design/ doubled linked list
1472. Design Browser History
641. Design Circular Deque

5. Override value
237. Delete Node in a Linked List
1721. Swapping Nodes in a Linked List

6. Monotonic stack
1019. Next Greater Node In Linked List

7. DFS/BFS
426. Convert Binary Search Tree to Sorted Doubly Linked List
114. Flatten Binary Tree to Linked List
430. Flatten a Multilevel Doubly Linked List
116. Populating Next Right Pointers in Each Node
109. Convert Sorted List to Binary Search Tree
117. Populating Next Right Pointers in Each Node II
1367. Linked List in Binary Tree

8. Design
622. Design Circular Queue
146. LRU Cache: OrderedDict and dict+linked list
1670. Design Front Middle Back Queue
379. Design Phone Directory
355. Design Twitter
707. Design Linked List

9. Delete nodes
203. Remove Linked List Elements
83. Remove Duplicates from Sorted List
1836. Remove Duplicates From an Unsorted Linked List
82. Remove Duplicates from Sorted List II
1474. Delete N Nodes After M Nodes of a Linked List

10.Question needs to be practiced
328. Odd Even Linked List

11.Sorting
147. Insertion Sort List

12.Prefix Sum
1171. Remove Zero Sum Consecutive Nodes from Linked List

13.Tricks
There are some tricks used in solving linked list questions

When we would like to construct an integer from a string or linked list, we can always use this pattern. For example: 
string = 'xxx'
integer = 0
for item in string:
	integer = integer*base + item
Here base can be 10 base, 2 base. 
Comments (3)