反转链表
null→1(head)→2→3→4→5→null
解法1:双指针解法
①初始化:
pre = null,cur = head
还需要temp指针用于保存cur指针的下一结点,否则当结点反转时,cur指针无法后移到下一结点。
②明确循环停止条件:
最后一步应该是:pre = 4,cur = 5
下一步应该退出循环,不满足循环条件:pre = 5,cur = null
所以循环条件可以是:cur != null
class Solution:
def reverseList(self,head):
pre = null
cur = head
while(cur != None):
temp = cur.next
cur.next = pre # 反转
pre = cur
cur = temp
return pre # 此时head=5,顺着打印出来
解法2:递归解法
class Solution:
def reverse(self,pre,cur):
if(cur == None):
return pre
temp = cur.next
cur.next = pre
pre = cur
cur = temp
return self.reverse(pre,cur)
def reverseList(self,head):
return self.reverse(None,head) # 初始化
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
无虚拟头结点:
①判断头结点是否需要删除:【7,7,7】,val=7;【7,6,8】,val=7;【7】,val=7
②判断其它结点是否需要删除:【6,7,7,8】,val=7
class Solution:
def removeVal(self,head,val):
while head.next and head == val: # while:当头结点=val,下一结点也=val
head = head.next
if(head == None): # 当链表都被移除,返回None
return head
cur = head
while cur.next:
if(cur.next == val): # 当两个val相邻时,移除一个后应该接着判断下一结点是否等于val
cur.next = cur.next.next
else:
cur = cur.next
return head
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点
快慢指针法:
定义一个快指针和一个慢指针,快指针后移n步,接着快慢指针一起后移,当快指针后移到尾结点时,慢指针在倒数第n+1的位置。
首先创建一个虚拟头结点,好处:
①方便删除第一个结点
class Solution:
def removeNth(self,head,n):
fast = dummyNode(next = head)
slow = dummyNode(next = head)
for i in range(n):
fast = fast.next
while(fast.next):
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return dummyNode.next