删除链表的倒数第k个元素
利用双指针一次遍历
package Mystudy.Liner;
/*
* 删除链表中倒数第k个节点
*/
/**
* @author coming
*/
public class DeleteKNode {
public static void main(String[] args) {
int[] arr = {1,3,4,5,6,7,8};
Node head = new Node(0);//哑元
Node n = head;
for(int i=0;i<arr.length;i++) {
n.next = new Node(arr[i]);
n = n.next;
}
//删除前
System.out.println("------删除前的链表:");
System.out.println(toString(head));
DeleteNode(head,3);
//删除后
System.out.println("------删除倒数第k个节点后的链表:");
System.out.println(toString(head));
}
public static String toString(Node head) {
StringBuilder sb = new StringBuilder();
Node p = head.next ;
while(p!=null) {
sb.append(p.value+" ");
p = p.next;
}
return sb.toString();
}
//利用双指针移动删除节点
private static Node DeleteNode(Node head, int n) {
if(head.next==null || n<0) return null;
Node p = head;//开始指针
Node p1 = head;//结束指针
int count=0;
while(count < n && p.next!=null ) {//当所给定的n大于链表长度时,count<n成立,但是链表已经遍历到末尾
p = p.next;
count++;
}
if(count < n) return null;//直接返回null;
while(p.next!=null) {
p = p.next;
p1 = p1.next;
}
//找到了倒数第k个节点,将其删除
p1.next = p1.next.next;
return p1;//返回删除的节点的前一个节点
}
}
附上几组测试数据:
到给定的n大于链表的长度时,删除无效:
删除链表时需要注意边界。