`
lg_asus
  • 浏览: 190761 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

单向链表的删除和反转

 
阅读更多
今天部门测试,两道题:
1:删除一个单向链表中值为某个特定值的所有节点
2:把一个单向链表反转

第一个题目比较简单,第二个题目有点难,我吭哧半天没搞出来,丢人。。。

写在卷面上的答案要是搬到计算机上,100%得不到正确结果,呃,太依赖调试了。。。

Node类:
/**
 * chega
 * 2012-12-5下午2:55:52
 */

/**
 * @author chega
 *
 * 2012-12-5下午2:55:52
 *
 */
public class Node
{

	public int item;
	public Node next;
	
	public Node(int item){
		this.item = item;
		this.next = null;
	}
	
	public Node(int item, Node next){
		this.item = item;
		this.next = next;
	}
	
	public static Node createNodeList(int[] args){
		Node nextNode = null;
		Node node = null;
		for(int i=args.length-1; i>=0;i--){
			node = new Node(args[i], nextNode);
			nextNode = node;
		}
		return node;
	}
	
	@Override
	public String toString(){
		if(this.next == null){
			return this.item +"[next: null]";
		}else{
			return this.item +"[next: "+ this.next.item+"]";
		}
	}
	
	public String getDetailDesc(){
		StringBuilder sb = new StringBuilder();
		sb.append(this.item);
		Node head = this;
		while(head.next != null){
			sb.append("->" + head.next.item);
			head = head.next;
		}
		return sb.toString();
	}
}



删除节点:
/**
 * @author chega
 * 
 *         2012-12-5下午3:31:47
 * 
 */
public class DeleteNode
{
	Node	list	= Node.createNodeList(new int[] { 1, 1, 3, 5, 7, 9, 1, 1 });

	public static void main(String... args)
	{
		new DeleteNode().delete(1);
	}

	public void delete(int del)
	{
		System.out.println(list.getDetailDesc());
		Node currNode = list;//从链表的head开始
		Node previousNode = null;
		while (currNode != null)
		{
			if (currNode.item == del)
			{
				if (previousNode != null)
				{
					//删除当前节点:把当前节点的next赋值给上一个节点的next即可
					previousNode.next = currNode.next;
				}
				//如果previousNode == null说明删除的是链表的head,因此链表从head.next开始
				else
				{
					list = list.next;
				}
			}
			else
			{
				previousNode = currNode;
			}
			currNode = currNode.next;
		}

		System.out.println(list.getDetailDesc());
	}
}



反转链表:
/**
 * @author chega
 * 
 *         2012-12-5下午2:57:40
 * 
 */
public class ReverseOneWayNodeList
{

	Node	list	= Node.createNodeList(new int[]{1,3,5,7,9,1,2});

	public static void main(String... args)
	{
		new ReverseOneWayNodeList().reverseNodeList();
	}

	public void reverseNodeList()
	{
		//前一个节点
		Node previousNode = null;
		//后一个节点
		Node nextNode = null;
		//当前节点
		Node currNode = list;
		while(currNode!= null){
			nextNode = currNode.next;
			currNode.next = previousNode;
			previousNode = currNode;
			currNode = nextNode;
		}
		
		//把上一个节点赋值给单向链表
		list = previousNode;
		
		System.out.println(list.getDetailDesc());
	}
}

分享到:
评论

相关推荐

    单向链表源代码

    这段源代码提供了一个简单的单向链表实现,包括插入、删除和打印链表的方法。你可以根据实际需求扩展其他功能,如查找节点、反转链表等。在培训班中,这样的代码示例有助于学员理解和掌握单向链表的工作原理及其在...

    单向链表类模板_单向链表类模板_fastchq_

    单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在C++编程中,为了实现通用性,我们通常会使用模板类来创建单向链表,以便它可以处理不同类型的元素。标题"单向链表类...

    单向链表实验报告(数据结构)

    2. 学习并实现单向链表的基本操作,包括插入和删除元素。插入操作是在指定位置插入新节点,删除操作则是找到特定元素并移除对应的节点。 实验内容包括以下部分: 1. 创建带头结点的单向链表:随机生成或通过键盘...

    Java实现单向链表反转

    在main方法中,我们创建了一个单向链表A->B->C->D->E->F,然后使用LinkedListReversor.RECURSION和LinkedListReversor.NO_RECURSION两种策略来实现单向链表反转。最后,我们使用print方法来打印反转后的链表结果。 ...

    C#实现单向链表C# .net 链表 单向链表

    本文将详细介绍如何在C#中实现一个基本的单向链表,并探讨其核心概念和基本操作。 #### 二、节点定义 在单向链表中,节点是构成链表的基本单元。每个节点通常包括以下部分: 1. **值**: 存储的数据。 2. **下一个...

    单向链表实现

    单向链表是一种基本的数据结构,它在计算机科学和编程中有着广泛的应用。与数组不同,链表不连续存储元素,而是通过节点之间的指针连接。每个节点包含两部分:数据域,用于存储数据;指针域,指向下一个节点的位置。...

    C语言实现的一个单向链表逆转

    单向链表是一种基本的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表逆转是计算机科学中常见的操作,它将链表中的元素顺序颠倒,使得原链表的最后一个元素成为新链表的第一个元素,而...

    lianbiao.rar_单向链表

    除了基本的插入和删除,单向链表还支持其他高级操作,如查找、反转和合并等。查找操作需要从头节点开始遍历链表,直到找到目标节点或遍历完整个链表。链表的反转则需要改变每个节点的指针方向,使得原后续节点变为...

    逆转单向链表(有7种方法)

    单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的引用。在编程中,经常需要对链表进行各种操作,其中之一就是逆转链表。逆转链表的操作可以改变链表中节点的顺序,使得原本的...

    单向链表的功能

    单向链表是一种基本的数据结构,它在计算机科学和编程中扮演着重要角色。相比于数组,链表在处理动态数据和内存管理上有着独特的优点。本文将深入探讨单向链表的功能及其实现。 首先,我们要理解单向链表的基本概念...

    c++单向链表

    在C++中实现单向链表涉及创建节点类、插入节点、删除节点、遍历链表等操作。下面我们将详细探讨这些知识点。 一、链表节点的定义 在C++中,我们首先需要定义一个结构体或类来表示链表节点。通常,这个结构体会包含...

    单向链表(一) 结构体、创建链表、遍历链表

    同时,链表的操作如删除节点、查找节点、反转链表等也是面试和编程竞赛中常见的问题。理解和熟练掌握链表的这些基本操作对于提升编程技能至关重要。 总结来说,单向链表是一种灵活的数据结构,其节点通过指针相互...

    java链表反转及排序

    在“java链表反转及排序”这个主题中,我们将探讨如何在Java中实现单向链表的反转和排序。首先,我们创建一个链表节点类,包含数据和指向下一个节点的引用: ```java public class ListNode { int val; // 节点值 ...

    数据结构:单向链表源码

    单向链表是一种基本的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的引用。在计算机科学和编程领域,理解并能够实现单向链表的源码是至关重要的,因为它是构建更复杂数据结构(如双向链表、循环...

    VC 单向/双向链表模板类实例二则.rar

    除了单向链表的基本方法外,还会增加一些针对双向特性的方法,如`insertAfter(T val, T searchVal)`在特定节点之后插入新节点,`deleteBefore(T val)`删除某个节点前的节点,以及`reverse()`反转链表等。 在提供的...

    C++链表的反转

    链表分为单向链表(本例中使用)和双向链表。 #### 二、链表的创建与初始化 在C++中,链表可以通过定义结构体来表示。结构体包含一个整型数据成员`data`和一个指向同类结构体的指针成员`next`。 ```cpp typedef ...

    一次遍历查找单向链表的中间结点

    单向链表是链表的一种类型,其中每个节点仅有一个指向下一个节点的指针,而没有指向前一个节点的指针。 **中间结点问题** 是链表操作中的一个重要话题,特别是在面试和算法设计中经常出现。给定一个单向链表,找到...

    C语言之单向链表详解及实例代码

    1,单向链简洁。...根据示例代码中的例子,完成单向链表(single linked list)中的以字符串为数据的链表的插入、删除以及查找,并支持单向链表的反转; 3,代码实现。 #include #include <math.h>

    单向链表的逆置 C++源代码

    单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的逆置是将链表中的顺序反转,即将原链表的首节点变为尾节点,原尾节点变为首节点,其余节点依次调整指针方向。这...

Global site tag (gtag.js) - Google Analytics