删除链表倒数第n个节点
方法一:使用双指针
算法过程:
- 设置一个dummy节点,指向head,设置fast,slow节点为dummy节点
- fast节点往前走n+1步
- fast和slow节点同时往前走,直到fast节点指向null
代码如下
public Node deleteLastN(Node head,int n){
Node dummy = new Node(0);
dummy.next = head;
Node fast = dummy,slow = dummy;
int cnt=0;
while (cnt<=n){
fast = fast.next;
cnt++;
}
while (fast!=null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return dummy.next;
}
方法二:递归求解
算法过程:
- 使用求节点位置函数,返回该节点是倒数第几个节点
- 当该节点是倒数第n+1个节点时,进行删除操作
- 求head节点的位置,如果head节点正好是倒数第n个节点,则返回head.next
代码如下:
public Node deleteLastN(Node head,int n){
int pos = getPos(head, n);
if (pos==n){
return head.next;
}
return head;
}
public int getPos(Node node,int n){
if (node==null){
return 0;
}
int pos = getPos(node.next, n)+1;
if (pos==n+1){
node.next = node.next.next;
}
return pos;
}
总结
面试过程中往往会问到多种方法求解,可以考虑上述两个方法。