JAVA手写代码链表反转_数据结构List示例(一):链表反转

链式存储结构就是两个相邻的元素在内存中可能不是相邻的,每一个元素都有一个指针域,指针域一般是存储着到下一个元素的指针。这种存储方式的优点是插入和删除的时间复杂度为O(1),不会浪费太多内存,添加元素的时候才会申请内存,删除元素会释放内存,。缺点是访问的时间复杂度最坏为O(n),关于查找的算法很少,一般只能遍历,这样时间复杂度也是线性(O(n))的了,频繁的申请和释放内存也会消耗时间。

顺序表的特性是随机读取,也就是访问一个元素的时间复杂度是O(1),链式表的特性是插入和删除的时间复杂度为O(1)。要根据实际情况去选取适合自己的存储结构。

链表就是链式存储的线性表。根据指针域的不同,链表分为单向链表、双向链表、循环链表等等。

链表反转也是比较常见的问题,一般解决方式是:分别设置三个指针。第一个指针保持结果,第二个指针指向当前的节点,第三个指针保存下一个节点。实现代码如下:

/**     * @Title: ListReverse.java   * @Package List   * @Description: 链表翻转问题  * @author peidong    * @date 2017-4-20 上午8:51:58   * @version V1.0     */   /**  * 本例提供两种思路  * 1.设置三个变量,分别保存当前结点,下一个结点以及备用,依次反转  * 2.设置三个变量,分别保存头结点和尾结点以及备用,头尾对称反转  * 本例将利用迭代和递归两种方式实现第一种思路  */ package List;   /**  * @ClassName: ListReverse  * @Description: TODO  * @date 2017-4-20 上午8:51:58  *   */ public class ListReverse {   /** *  * @ClassName: Node * @Description: 构建结点 * @date 2017-4-20 上午9:00:32 *  */ public static class Node { public int data; public Node next;   public Node(int data) { this.data = data; this.next = null; } }   /** *  * @ClassName: LinkList * @Description: 构建链表 * @date 2017-4-20 上午9:05:50 *  */ public static class LinkList { // 根结点 private Node root;   /** *  * @Title: push * @Description: 向链表插入数据 * @param @param data * @return void * @throws */ public void push(int data) { Node cur = root; if (root == null) { // 分配内存空间 root = new Node(data); return; } while (cur.next != null) { cur = cur.next; } // 分配内存空间 cur.next = new Node(data); }   /** *  * @Title: linkReversr * @Description: 非递归实现链表反转,例如4-3-2-1反转后1-2-3-4 * @param @return * @return Node * @throws */ public Node linkListReversre() { // 当前结点 Node cur = null; // 下一个结点 Node next = null; // 前一个结点 Node pre = null;   // 判断边界条件,空链表 if (root == null) { return null; } // 赋值 cur = root; // 当链表非空时,执行反转 while (cur != null) { // 保存后一个结点 next = cur.next; // 注意此处反转的顺序不能乱 cur.next = pre; pre = cur; cur = next; } // 反转结束后修改头结点 root = pre; // 返回 return root; }  /** *  * @Title: listRecReverse  * @Description: 使用递归的方式反转链表 * @param @return     * @return Node     * @throws */ public Node linkListRecReverse(Node cur){ // Node cur = root; if(cur == null || cur.next == null){ return cur; } //递归 Node reverseRest = linkListRecReverse(cur.next); //反转 cur.next.next = cur; //源节点为空 cur.next = null; return reverseRest; }   public void printList() { Node cur = root; // 空表 if (root == null) { return; } // 非空 while (cur != null) { System.out.print(cur.data + " "); cur = cur.next; } } }   /** * @Title: main * @Description: TODO * @param @param args * @return void * @throws */   public static void main(String[] args) { // TODO Auto-generated method stub LinkList list = new LinkList(); //添加数据 list.push(10); list.push(2); list.push(3); list.push(4); list.push(5); list.push(6); //输出原始链表 list.printList(); System.out.println(); //非递归反转 list.linkListReversre(); //输出原始链表 list.printList();  }   }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值