前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >链表反转

链表反转

作者头像
九州暮云
修改2019-08-21 11:34:14
1.1K0
修改2019-08-21 11:34:14
举报
文章被收录于专栏:九州牧云九州牧云

链表反转的实现可以用两种方式:遍历法和递归法,最终的效果如下:

原始链表:->30->25->20->15->10->5

反转后的链表:->5->10->15->20->25->30

遍历法

遍历法过程如下:

  1. 创建三个节点:cur­rN­ode、pre­vN­ode和nextNode,并初始化cur­rN­ode = head、nextN­ode = null和pre­vN­ode = null;
  2. 从head头结点开始遍历链表,当currNode!=null时,一个个反转链表的指针:
代码语言:javascript
复制
while(currNode!=null){
     nextNode = currNode.next;
     currNode.next = prevNode;
     prevNode = currNode;
     currNode = nextNode;
}
  1. 设置head = prevNode。

实现过程如下图:

输入图片说明
输入图片说明

实现代码如下:

代码语言:javascript
复制
public class ReverseLinkedList {
	public static void main (String[] args) throws java.lang.Exception
	{
		LinkedListT a = new LinkedListT();
		a.addAtBegin(5);
		a.addAtBegin(10);
		a.addAtBegin(15);
		a.addAtBegin(20);
		a.addAtBegin(25);
		a.addAtBegin(30);
		a.display(a.head);
		a.reverseIterative(a.head);	}
}
class Node{
	public int data;
	public Node next;
	public Node(int data){
		this.data = data;
		this.next = null;
	}
}
class LinkedListT{
	public Node head;
	public LinkedListT(){
		head=null;
	}

	public void addAtBegin(int data){
		Node n = new Node(data);
		n.next = head;
		head = n;
	}
	
	public void reverseIterative(Node head){
		Node currNode = head;
		Node nextNode = null;
		Node prevNode = null;

		while(currNode!=null){
			nextNode = currNode.next;
			currNode.next = prevNode;//反转:使链表的下一个节点和上一个节点相连
			prevNode = currNode;//保存反转后的链表
			currNode = nextNode;
		}
		head = prevNode;
		System.out.println("\n Reverse Through Iteration");
		display(head);
	}

	public void display(Node head){
		//
		Node currNode = head;
		while(currNode!=null){
			System.out.print("->" + currNode.data);
			currNode=currNode.next;
		}
	}
}

递归法

递归法过程如下:

  1. 通过递归的方式,找到链表的结束节点,并保存在head变量中;
  2. 这时,剩余的链表节点会被保存在一个栈结构里面,接下来我们使用递归的方式从栈里面弹出这些节点,将它们和head节点一个个连接起来。

实现过程如下图:

输入图片说明
输入图片说明

实现代码如下:

代码语言:javascript
复制
public class ReverseLinkedList {
    public static void main (String[] args) throws java.lang.Exception
    {
        LinkedListT a = new LinkedListT();
        a.addAtBegin(5);
        a.addAtBegin(10);
        a.addAtBegin(15);
        a.addAtBegin(20);
        a.addAtBegin(25);
        a.addAtBegin(30);
        a.display(a.head);
        a.reverseRecur(a.head); 
    }
}
class Node{
    public int data;
    public Node next;
    public Node(int data){
        this.data = data;
        this.next = null;
    }
}
class LinkedListT{
    public static Node head=null;
    public LinkedListT(){
        head=null;
    }

    public void addAtBegin(int data){
        Node n = new Node(data);
        n.next = head;
        head = n;
    }
    
    public Node reverseRecur(Node current){
		if(current==null){
			return null;
		}
		if(current.next==null){
			head = current;
			return null;
		}
		reverseRecur(current.next);
		current.next.next = current;
		current.next = null;
		return head;
	 }

    public void display(Node head){
        //
        Node currNode = head;
        while(currNode!=null){
            System.out.print("->" + currNode.data);
            currNode=currNode.next;
        }
    }
}

编译自:Reverse a Linked List

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 遍历法
  • 递归法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档