数据结构复习1——链表反转
2015-10-13 10:06
441 查看
用了两种方式,递归和非递归的方式。
![](https://img-blog.csdn.net/20151013141641675?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20151013141808235?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
采
1)定义数据结构
2.进行链表反转
采
1)定义数据结构
class Node { //变量 private int record; //指向下一个对象 private Node nextNode; public Node(int record) { super(); this.record = record; } public int getRecord() { return record; } public void setRecord(int record) { this.record = record; } public Node getNextNode() { return nextNode; } public void setNextNode(Node nextNode) { this.nextNode = nextNode; } }
2.进行链表反转
public class ReverseSingleList { /** * 递归,在反转当前节点之前先反转后续节点 */ public static Node reverse(Node head) { if (null == head || null == head.getNextNode()) { //空结点或者没有后续结点 return head; } Node reversedHead = reverse(head.getNextNode());//反转后序结点 head.getNextNode().setNextNode(head); head.setNextNode(null); return reversedHead; } /** * 遍历,将当前节点的下一个节点缓存后更改当前节点指针 * */ public static Node reverse2(Node head) { if (null == head) { return head; } Node pre = head; Node cur = head.getNextNode(); Node next; while (null != cur) { next = cur.getNextNode(); cur.setNextNode(pre); pre = cur; cur = next; } //将原链表的头节点的下一个节点置为null,再将反转后的头节点赋给head head.setNextNode(null); head = pre; return head; } public static void main(String[] args) { Node head = new Node(0); Node tmp = null; Node cur = null; // 构造一个长度为10的链表,保存头节点对象head for (int i = 1; i < 10; i++) { tmp = new Node(i); if (1 == i) { head.setNextNode(tmp); } else { cur.setNextNode(tmp); } cur = tmp; } //打印反转前的链表 Node h = head; while (null != h) { System.out.print(h.getRecord() + " "); h = h.getNextNode(); } //调用反转方法 head = reverse2(head); System.out.println("\n**************************"); //打印反转后的结果 while (null != head) { System.out.print(head.getRecord() + " "); head = head.getNextNode(); } } }自己动手实现链表的反转
package com.sxt.service; public class leiReverseList { public static void IteratorLst(Node head)//对链表进行迭代 { Node currNode=null; currNode=head; while(currNode!=null) { System.out.print( currNode.getRecord()+" "); currNode=currNode.getNextNode(); } } public static Node reverseNode(Node n) { if(n==null||n.getNextNode()==null)//空结点或者单结点直接返回即可 { return n; } Node subList=reverseNode(n.getNextNode());//将后面的子链表进行反转 n.getNextNode().setNextNode(n); n.setNextNode(null);//n在反转之后总是在末尾 所以将其后续的结点赋值为空 return subList; } public static Node reverseNode2(Node n)//非递归方式记性遍历 { if(n==null)//如果是空结点 则直接进行返回即可 { return n; } Node pre=n;//用来保存反转之后的内容 Node curr=n.getNextNode();//要反转的当前位置 while(curr!=null) { Node next=curr.getNextNode();//用来保存尚未反转的内容 curr.setNextNode(pre);// pre=curr;//pre结点前移,用来保存已经反转的数据 curr=next;// } n.setNextNode(null);//此时原来的头结点已经放到最后的位置 return pre;//真正的头结点改为当前节点 } public static void main(String[] args) { Node head = new Node(0);//设置头结点 Node currNode=null;//用来记录当前结点的位置 for (int i = 1; i < 20; i++) { Node temp = new Node(i); if (i == 1) { head.setNextNode(temp); currNode=temp;// }else { currNode.setNextNode(temp); currNode=temp;//指向下一个结点 } } IteratorLst(head); System.out.println(); head=reverseNode2(head); IteratorLst(head); } }
相关文章推荐
- 数据结构笔记
- 理解 OpenStack + Ceph (4):Ceph 的基础数据结构 [Pool, Image, Snapshot, Clone]
- 数据结构试验二:链表
- Two Sum
- python数据结构学习笔记-2-算法
- 数据结构(七)链表
- 内存管理器(二)边界标识法
- Billboard(线段树,单点更新)
- 数据结构(八)二叉树遍历
- 数据结构(十)完全二叉树节点个数计算
- 数据结构(九)满二叉树深度计算
- 残缺棋盘
- 选择算法
- 【ShancoLove】带你看数据结构——第五课:堆栈
- 【以太网数据结构】IP协议
- 数据结构之-线性表
- 【ShancoLove】带你看数据结构——第四课:线性表链式结构(循环链表)
- 【读书笔记】大话数据结构之 栈(1)
- 二叉树-遍历
- 二叉树-层序遍历