📌  相关文章
📜  无需操作指针即可反转链表的Java程序

📅  最后修改于: 2022-05-13 01:54:24.021000             🧑  作者: Mango

无需操作指针即可反转链表的Java程序

给定一个链表,任务是用Java编写一个程序,在不操作其指针的情况下反转链表,即反转应该只通过更改数据值而不是链接来发生。

例子:

Input: Original linked list
1->2->3->4->5->null
Output: Linked list after reversal
5->4->3->2->1->null

Input: Original linked list
5->14->20->8->null
Output: Linked list after reversal
8->20->14->5->null

Input: Original linked list
80->null
Output: Linked list after reversal
80->null

对于反转,在连接链表节点的链接中不进行任何操作。仅更改数据值。为了更清楚地理解这一点,请看下图。

红色数字代表节点地址。需要注意的是,即使在反转之后,链路仍然保持不变,即在反转之前,地址100处的节点连接到地址200处的节点,而后者又连接到地址300处的节点,依此类推,并且这些连接在反转后也保持不变。

方法:

  1. 变量 'l' 和 'r' 分别初始化为 0 和 size-1,表示第一个和最后一个节点的索引。
  2. 在循环中,获取索引“l”和“r”处的节点并交换相应的数据值。循环通过增加 'l' 和减少 'r' 来工作。
  3. 为了在特定索引处获取节点,定义了一个私有方法“fetchNode”。

下面是上述方法的实现:

Java
// Java program to reverse a linked list without pointer
// manipulation
 
class Node {
    int value;
    Node next;
 
    Node(int val)
    {
        value = val;
        next = null;
    }
}
 
public class LinkedList {
    Node head;
 
    // this function returns the Node which is at a
    // particular index.
    // (The index is passed as the argument)
    private Node fetchNode(int index)
    {
        Node temp = head;
        for (int i = 0; i < index; i++) {
            temp = temp.next;
        }
        return temp;
    }
 
    // this function returns the size of linked list
    int getSize(Node head)
    {
        Node temp = head;
        int size = 0;
        while (temp != null) {
            size++;
            temp = temp.next;
        }
        return size;
    }
 
    // function to reverse the linked list
    void reverse()
    {
        int l = 0;
        int r = getSize(this.head) - 1;
        while (l < r) {
            Node leftSideNode = fetchNode(l);
            Node rightSideNode = fetchNode(r);
 
            int t = leftSideNode.value;
            leftSideNode.value = rightSideNode.value;
            rightSideNode.value = t;
 
            l++;
            r--;
        }
    }
 
    // function that prints the elements of linked list
    void printLinkedList()
    {
        Node temp = this.head;
        while (temp != null) {
            System.out.print(temp.value + " ");
            temp = temp.next;
        }
        System.out.println();
    }
 
    // Driver code
    public static void main(String[] args)
    {
        LinkedList list1 = new LinkedList();
        list1.head = new Node(1);
        list1.head.next = new Node(2);
        list1.head.next.next = new Node(3);
        list1.head.next.next.next = new Node(4);
        list1.head.next.next.next.next = new Node(5);
 
        System.out.println("Linked List Before Reversal: ");
        list1.printLinkedList();
 
        list1.reverse();
 
        System.out.println("Linked List After Reversal: ");
        list1.printLinkedList();
    }
}



输出
Linked List Before Reversal: 
1 2 3 4 5 
Linked List After Reversal: 
5 4 3 2 1