java實現---查詢單鏈表的倒數第K個節點,要求只能遍歷一次連結串列;;;刪除連結串列的倒數第k個節點
阿新 • • 發佈:2019-01-01
java實現
查詢單鏈表的倒數第K個節點,要求只能遍歷一次連結串列
- 定義兩個前後節點forward和backward
- 先讓forward走 k 步,再讓forward和backward一起走,當forward走到空,此時backward就走到了倒數第k步
class ListNode{ int data; ListNode next; } public class Link{ public static void FindTailK(ListNode first,int k){ ListNode forward = first; ListNode backward = first; while(k-- != 0){ forward = forward.next; } while(forward != null){ forward = forward.next; backward = backward.next; } System.out.println(backward.data); } public static void main(String[] args) { ListNode n1 = new ListNode(); ListNode n2 = new ListNode(); ListNode n3 = new ListNode(); ListNode n4 = new ListNode(); ListNode n5 = new ListNode(); n1.data = 1; n2.data = 2; n3.data = 3; n4.data = 4; n5.data = 5; n1.next = n2; n2.next = n3; n3.next = n4; n4.next = n5; FindTailK(n1,2); } }
刪除連結串列的倒數第k個節點
- 想要刪除倒數第k個節點,可以找到倒數第k+1個節點,即k的前一個節點
- 第二步讓k的前一個節點的next指向k的後一個節點
- 即k節點就相當於被刪除啦
public class Link{ public static ListNode DeleteTailK(ListNode first,int k){ ListNode forward = first; ListNode backward = first; while(k-- != 0){ forward = forward.next; } while(forward.next != null){ //即最後的backward為k的前一個節點 forward = forward.next; backward = backward.next; } backward.next = backward.next.next; return first; } public static void print(ListNode head){ while(head != null){ System.out.println(head.data); head = head.next; } }