链表一些操作


public class javatest1 {   //聊表逆序
	public static void main(String[] args) {
		Node head = new Node(0);
		Node node1 = new Node(1);
		Node node2 = new Node(2);
		Node node3 = new Node(3);
		head.setNext(node1);
		node1.setNext(node2);
		node2.setNext(node3);

		// 打印反转前的链表
		Node h = head;
		while (null != h) {
			System.out.print(h.getData() + " ");
			h = h.getNext();
		}
		// 调用反转方法
		head = Reverse1(head);

		System.out.println("\n**************************");
		// 打印反转后的结果
		while (null != head) {
			System.out.print(head.getData() + " ");
			head = head.getNext();
		}
	}

	/**
	 * 递归,在反转当前节点之前先反转后续节点
	 */
	public static Node Reverse1(Node head) {
		// head看作是前一结点,head.getNext()是当前结点,reHead是反转后新链表的头结点
		if (head == null || head.getNext() == null) {
			return head;// 若为空链或者当前结点在尾结点,则直接还回
		}
		Node reHead = Reverse1(head.getNext());// 先反转后续节点head.getNext()
		head.getNext().setNext(head);// 将当前结点的指针域指向前一结点
		head.setNext(null);// 前一结点的指针域令为null;
		return reHead;// 反转后新链表的头结点
	}
}

	class Node {
		private int Data;// 数据域
		private Node Next;// 指针域

		public Node(int Data) {
			// super();
			this.Data = Data;
		}

		public int getData() {
			return Data;
		}

		public void setData(int Data) {
			this.Data = Data;
		}

		public Node getNext() {
			return Next;
		}

		public void setNext(Node Next) {
			this.Next = Next;
		}
	}



判断链表是否对称

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isSymmetric(TreeNode root) {
        //总体上分为两种情况,一种是空树,一种不是空树
        //case1 树为空
        if(root==null)return true;
        //case2 树不为空时要利用递归的方法
        return isSymmetric(root.left,root.right);
    }
    public boolean isSymmetric(TreeNode left,TreeNode right){
        //case1 树的左右子树为空
        if(left==null&&right==null)return true;
        //case2 树的左右子树有一个为空
        if(left==null||right==null)return false;
        //case3 树的左右子树均不为空,判断节点的值是否相等
        return left.val==right.val&&isSymmetric(left.left,right.right)&&isSymmetric(left.right,right.left);
        }
    }


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
链表是一种常见的线性数据结构,它由一系列节点组成,每个节点都包含一个数据元素和一个指向下一个节点的指针。链表的基本操作包括插入、删除、查找等。 1. 插入操作:插入节点时,只需要将新节点插入到链表的适当位置即可。具体实现方式如下: ``` Node* Insert(Node* head, int val) { Node* newNode = new Node(val); if (head == nullptr) return newNode; Node* cur = head; while (cur->next != nullptr) { cur = cur->next; } cur->next = newNode; return head; } ``` 2. 删除操作:删除节点时,需要先找到待删除节点的前一个节点,然后将其指针指向待删除节点的下一个节点。具体实现方式如下: ``` Node* Delete(Node* head, int val) { if (head == nullptr) return nullptr; if (head->val == val) return head->next; Node* cur = head; while (cur->next != nullptr && cur->next->val != val) { cur = cur->next; } if (cur->next != nullptr) cur->next = cur->next->next; return head; } ``` 3. 查找操作:查找节点时,只需要遍历链表,直到找到目标节点即可。具体实现方式如下: ``` Node* Search(Node* head, int val) { Node* cur = head; while (cur != nullptr && cur->val != val) { cur = cur->next; } return cur; } ``` 除了基本操作外,还有其他一些常见的操作,例如翻转链表、合并两个有序链表等。需要注意的是,在进行链表操作时,一定要注意指针的变化,以避免出现空指针异常等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值