24 swap nodes in pairs
思路:将链表内的元素两个一组分配,然后交换彼此的node。
定义两个指针,prev和curr,用来标识当前要交换的节点对。交换之前,prev指向节点对外的前一个节点,curr指向节点对内的第一个节点。即如果链表为1->2->3->4,第一对进行交换的是1和2,prev为链表前的一位dummy,curr为1
交换过程:
1)将prev.next指向curr.next、
2)将curr.next指向curr.next.next
3)最后,将curr.next.next和curr交换
最后更新prev和curr,以进行交换下一对
代码:
# Definition for singly-linked list.
class ListNode(object):
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution(object):
def swapPairs(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
dummy = ListNode(0)
dummy.next = head
prev = dummy
curr = head
if not head or not head.next:
return head
while curr and curr.next:
prev.next = curr.next
curr.next = curr.next.next
curr.next.next = curr
prev = curr
curr = curr.next
return dummy.next
额然后超时了。。。时间复杂度为O(n),对比较长的链表来说,会很复杂。所以递归一下:
class Solution(object):
def swapPairs(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
# 递归终止条件:如果链表为空或只剩一个节点,则无需交换,直接返回head
if not head or not head.next:
return head
# 交换当前节点和下一个节点
next_node = head.next
head.next = self.swapPairs(next_node.next)
next_node.next = head
# 返回交换后的头节点
return next_node
19 Remove Nth Node From End of List
思路:使用两个指针prev和curr,以及虚拟头dummy。执行删除指针即为本身的指针从指向下一位变成指向下下一位。
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def removeNthFromEnd(self, head, n):
dummy = ListNode(0)
dummy.next = head
prev = dummy
curr = head
length = 0
while curr:
length += 1
curr = curr.next
target_pos = length - n
for _ in range(target_pos):
prev = prev.next
prev.next = prev.next.next
return dummy.next