从链接列表结尾找到第n个元素

时间:2020-02-23 14:34:12  来源:igfitidea点击:

假设:

我们不知道LinkedList的大小,否则我们可以直接迭代并找到(长-N)TH节点

这个问题的算法是:

  • 使用两个指针FirstPtr和SecondPtr并初始化链接列表的负责人
  • 通过N-1节点移动FirstPtr。
  • 递增pricthtptr和secondptr,直到firstptr.next不等于null。
  • 第二个来自终端节点的第n个。

Java计划为此:

package org.igi.theitroad;
 
public class LinkedList{
 
	private Node head;
 
	private static class Node {
		private int value;
		private Node next;
 
		Node(int value) {
			this.value = value;
 
		}
	}
 
	public void addToTheLast(Node node) {
 
		if (head == null) {
			head = node;
		} else {
			Node temp = head;
			while (temp.next != null)
				temp = temp.next;
 
			temp.next = node;
		}
	}
 
 
	public void printList() {
		Node temp = head;
		while (temp != null) {
			System.out.format("%d ", temp.value);
			temp = temp.next;
		}
		System.out.println();
	}
 
 
	public Node nthFromLastNode(Node head,int n)
	{
		Node firstPtr=head;
		Node secondPtr=head;
 
		for (int i = 0; i < n; i++) {
			firstPtr=firstPtr.next;
 
		}
 
		while(firstPtr!=null)
		{
			firstPtr=firstPtr.next;
			secondPtr=secondPtr.next;
		}
 
		return secondPtr;
	}
 
	public static void main(String[] args) {
		LinkedList list = new LinkedList();
		//Creating a linked list
		Node head=new Node(5);
		list.addToTheLast(head);
		list.addToTheLast(new Node(6));
		list.addToTheLast(new Node(7));
		list.addToTheLast(new Node(1));
		list.addToTheLast(new Node(2));
 
		list.printList();
		//Finding 3rd node from end
		Node nthNodeFromLast= list.nthFromLastNode(head,3);
		System.out.println("3th node from end is : "+ nthNodeFromLast.value);
 
	}
 
}

逻辑上我们的LinkedList看起来像如下:

彩色节点从最后表示第3节点。
运行上面的程序,我们将获取以下输出:

5 6 7 1 2 
3th node from end is : 7