链表转向
206
(进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?)
迭代解法
指针:pre
curr
next(记录完成反转后要到的下一个节点)
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre=null;
ListNode curr=head;
while(curr!=null)
{
ListNode next =curr.next;
curr.next=pre;
pre=curr;
curr=next;
}
return pre;
}
}
递归解法
为什么这个问题可以用递归方式解决:
该问题符合递归算法的求解条件:
大问题可以拆分成小问题-----要实现链表的反转可以拆分成实现头结点的反转和实现出头结点外剩余节点组成的新链表的反转
子问题的解决方式和大问题的一样----头结点只有一个节点无需反转,新链表的反转实现可以继续拆分成头结点的反转和除头结点外结点组成的新新链表的反转
存在最小子问题----一直拆分拆分...最后只有一个节点的n新链表
public ListNode reverseList(ListNode head) {
// 1. 递归终止条件
if (head == null || head.next == null) {
return head;
}
ListNode p = reverseList(head.next);
head.next.next = head;
head.next = null;
return p;
}
链表中倒数第k个节点
顺序查找,先求出链表的长度 n,然后顺序遍历到链表的第 n - k 个节点返回
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
int n = 0;
ListNode node = null;
for (node = head; node != null; node = node.next) {
n++;
}
for (node = head; n > k; n--) {
node = node.next;
}
return node;
}
}