Java程序成对反转链表

时间:2020-02-23 14:35:08  来源:igfitidea点击:

在本教程中,我们将看到如何成对地反转链表。

可以有两个解决方案,用于成对反转链接的列表

  • 迭代
  • 递归

迭代:

这将是:

public static Node reverseLinkedListInPairItr(Node head) {
 
	Node current=head;
	Node temp=null;
	Node newHead =null;
	while (current != null && current.next != null) {
 
		if (temp != null) {
			//This is important step
			temp.next.next = current.next;
		}
		temp=current.next; 
		current.next=temp.next;
		temp.next=current;
 
		if (newHead == null)
			newHead = temp;
		current=current.next;
 
	} 
	return newHead;
}

解释:

借助简单的例子的帮助来理解:让我们说LinkedList是5-> 6 - > 7 - > 1如果你仔细观察,下面的步骤只是在第一次迭代中倒转到6-> 5-> 7-> 1的链接(交换节点6和5)然后前进到下一个对(节点7和1)

//Node 6 is temp node
temp=current.next;     
//putting link between 5->7
current.next=temp.next;
//putting link between 6->5
temp.next=current;
//6 becomes head node here

我们必须想知道我们为什么要付出以下代码:

if (temp != null) {
      //This is important step
      temp.next.next = current.next;
}

在交换两个节点之前,我们需要正确链接节点。
当我们交换7和1时,5-> 7之间的链接将被损坏,我们需要将节点5连接到节点1.根据上面的代码,在第一次迭代(交换节点6和5)中的临时将为空,但是当电流时节点是7,temp将是6,在这里我们将节点链接到6-> 5-> 1-> 7以下

Java计划为此:

package org.igi.theitroad;
 
public class ReverseLinkedListInPair{
 
	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 head) {
		Node temp = head;
		while (temp != null) {
			System.out.format("%d ", temp.value);
			temp = temp.next;
		}
		System.out.println();
	}
 
	//Reverse linked list in pair
	public static Node reverseLinkedListInPairs(Node head) {
 
		Node current=head;
		Node temp=null;
		Node newHead =null;
		while (current != null && current.next != null) {
 
			if (temp != null) {
				//This is important step
				temp.next.next = current.next;
			}
			temp=current.next;     
			current.next=temp.next;
			temp.next=current;
 
			if (newHead == null)
				newHead = temp;
			current=current.next;
 
		}     
		return newHead;
	}
 
 
	public static void main(String[] args) {
		ReverseLinkedListInPair list = new ReverseLinkedListInPair();
		//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.addToTheLast(new Node(8));
 
		list.printList(head);
		//Reversing LinkedList in pairs
		Node result=reverseLinkedListInPairs(head);
		System.out.println("After reversing in pair");
		list.printList(result);
	}
}

运行上面的程序,我们将获取以下输出:

5 6 7 1 2 8
After reversing
6 5 1 7 8 2

递归:

基本情况:基本情况为此为null为null或者node.next为null

对于递归解决方案,将上述程序的ReverselinkedListinapa替换为以下函数

public static Node reverseLinkedListInPairs(Node head) {
      if (head == null || head.next == null) {
          return head;
      }
  //Lets take example of 5->6->7
  //Here head node is 5    
  //Storing 6 in temp node, it will become our new head    
     Node temp=head.next;
  //Putting link between 5->7   
     head.next=temp.next;
  //putting link between 6->5
     temp.next=head;
  //recursively calling the function for node 7
     head.next=reverseLinkedListInPairRec(head.next);
  //returning new head
     return temp;
  }