Java-反转单链表

单链表的反转比较简单,迭代和递归都可以做。

先定义一个类用于表示单链表中的结点:

public class ListNode {
	private int val;
	private ListNode next;

	public ListNode(int value){
		this.val = value;
		this.next = null;
	}

	public int getVal() {
		return val;
	}
	public void setVal(int val) {
		this.val = val;
	}
	public ListNode getNext() {
		return next;
	}
	public void setNext(ListNode next) {
		this.next = next;
	}
}

迭代的方法:

/**
 * 遍历,双指针一前一后同时向尾部移动
 * @param head 要反转的链表的头结点
 * @return
 */
public static ListNode reverse(ListNode head){
	if(head==null){
		return head;
	}
	ListNode pre = head; 			//前一个指针
	ListNode cur = head.getNext();  //后一个指针
	ListNode next;					//临时对象,指针后移时要用到的
	while(cur != null){
		next = cur.getNext();
		cur.setNext(pre);
		pre = cur; //指针后移
		cur = next;//指针后移
	}

	//一定记得把初始链表头结点的next置为null,因为反转后它将会是最后一个结点
	head.setNext(null);
	//把头结点设为反转后链表的第一个结点,然后返回就ok
	head = pre;
	return head;

}

递归的方法:

/**
 * 递归思想
 * 在翻转当前节点之前,如果该节点有后续节点,先翻转其后续节点
 * 如果该节点没有子节点,就把该节点的next指向其父节点,并把父节点的next置为null
 * @param head
 * @return
 */
public static ListNode reverse(ListNode head){
	//当前结点为null,或者当前结点没有后续结点时,递归退出
	if(head.getNext()==null || head==null){
		return head;
	}

	//当前结点不为null并且有next时,递归去反转它的后续结点
	ListNode tempNode = reverse(head.getNext());

	//反转当前结点和它的子结点
	head.getNext().setNext(head);
	head.setNext(null);

	return tempNode;
}

测试函数:

public static void main(String[] args){
	ListNode node1 = new ListNode(1);
	ListNode node2 = new ListNode(2);
	ListNode node3 = new ListNode(3);
	ListNode node4 = new ListNode(4);

	node1.setNext(node2);
	node2.setNext(node3);
	node3.setNext(node4);

	node1 = reverse(node1);

	while(node1 != null){
		System.out.print(node1.getVal()+" ");
		node1 = node1.getNext();
	}
}
时间: 2025-01-07 15:58:55

Java-反转单链表的相关文章

Java反转单链表(code)

主要是面试中可能会经常碰上该类似操作,尤其是稍大点公司,面试官可能并不在乎你能不能搞定该题,但是这类型题目最是能体现程序员的思维状态 ---一个迷糊头脑的程序员 怎能立志改变这个世界 /** * @author luochengcheng * 定义一个单链表 */ class Node { //变量 private int record; //指向下一个对象 private Node nextNode; public Node(int record) { super(); this.record

【LeetCode-面试算法经典-Java实现】【092-Reverse Linked List II(反转单链表II)】

[092-Reverse Linked List II(反转单链表II)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Reverse a linked list from position m to n. Do it in-place and in one-pass. For example: Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->

Java 实现单链表反序

//单链表反序 public class SingleLinkedListReverse { public static void main(String[] args) { Node head = new Node(0); Node temp = null; Node cur = null; for (int i = 1; i <= 10; i++) { temp = new Node(i); if (i == 1) { head.setNext(temp); } else { cur.set

递归、非递归 反转单链表

定义链表结构 struct ListNode { int val; ListNode *next; ListNode(int v) : val(v), next(NULL) {} }; 非递归反转单链表 ListNode* reverse(ListNode *root) { if (root == NULL || root->next == NULL) return root; ListNode *cur = root->next; root->next = NULL; while (c

C语言:【单链表】逆置反转单链表

#include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int DataType; typedef struct SListNode {     DataType data;     struct SListNode* next; }SListNode; SListNode* BuyNode(DataType x) {     SListNode* next = (SListNode*)malloc

java实现单链表

前面已经介绍了java如何实现顺序链表:http://www.cnblogs.com/lixiaolun/p/4643664.html 接下来,我们开始学习java实现单链表. 单链表类 package linklist; public class LinkList { class Element { public Object value=null; private Element next=null; } private Element header = null;//头结点 /** * 初

算法题:反转单链表

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:存在一个单链表,头指针为head,实现单链表的反转Node *Reverse(Node *head).  该算法的求解办法有很多,如: 方法1:先顺序变量单链表,将结点保存到栈中,在从栈中弹出结点,重新建立一个新的单链表: 方法2:用<剑指offer>里面给出的算法,用三个指针来实现: 方法3:采用递归实现,是方法2的递归实现形式. 本文主要给出方法2和方法3,在给出具体的代码之前,先要注意几个问题:          (1)如果hea

java 实现单链表的逆序

</pre><pre name="code" class="java">package com.ckw.mianshi; /** * java 实现单链表的逆序 * @author Administrator * */ public class SingleLinkedReverse { class Node{ int data; Node next; public Node(int data){ this.data = data; } }

JAVA 实现单链表

1 public class LinkNode { 2 public String data; 3 public LinkNode next; 4 5 LinkNode(){ 6 this.data = "a"; 7 this.next = null; 8 } 9 10 LinkNode(String string){ 11 this.data = string; 12 this.next = null; 13 } 14 } 1 public class LinkList { 2 3

反转单链表并验证(详解)

单链表优点: 可以动态增加和删除. 不需要定义初始大小. 点链表缺点: 不能随机访问.需要逐个遍历直到找到目标项. 用到动态内存分配和指针,代码复杂度提升,内存泄漏和内存段错误风险提升. 开销大较大,因为是动态分配内存.而且每项需要存储一个额外的指针. 定义单链表: ------------------------------ ------------------------------ | | | \ | | | | val | next |--------------| val | next