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;//这样写有问题,应该把要删除的节点置为nullslow.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和nextListNode next = head.next;//当前头节点指向以后完成后的子链表head.next = swapPairs(next.next);//因为交互,当前的next的下一个指向headnext.next = head;//返回当前链表的头节点,即为nextreturn next;}
}