1.快慢指针
主要用于链表遍历节点的功能
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//要想能够返回头节点,需要给head节点添加一个头节点,便于返回结果
ListNode dummyNode = new ListNode(0);
dummyNode.next = head;
//定义快慢指针
ListNode fast = dummyNode;
ListNode slow = dummyNode;
//当快节点指向null时,要使慢节点指向要删除节点的前一个,故和fast的间隔为n + 1,所以要先让fast先走
for(int i = 0; i <= n;i++){
fast = fast.next;
}
while(fast != null){
fast = fast.next;
slow = slow.next;
}
// slow.next = slow.next.next;
//slow.next = null;
//这样写有问题,应该把要删除的节点置为null
slow.next = slow.next.next;
return dummyNode.next;
}
}
2.递归
递归本质就是不断重复的做同一件事情,而在这题中,将节点不断的交互,就是一级一级的过程
其中我们应该关心的主要有三点:
- 返回值
- 调用单元做了什么
- 终止条件
在本题中:
返回值:交换完成的子链表
★调用单元:设需要交换的两个点为 head 和 next,head 连接后面交换完成的子链表,next 连接 head,完成交换
终止条件:head 为空指针或者 next 为空指针,也就是当前无节点或者只有一个节点,无法进行交换
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null){
return head;
}
定义需要交互的两个节点,head和next
ListNode next = head.next;
//当前头节点指向以后完成后的子链表
head.next = swapPairs(next.next);
//因为交互,当前的next的下一个指向head
next.next = head;
//返回当前链表的头节点,即为next
return next;
}
}