链表基本问题集锦
来源:互联网 发布:算法设计与分析第二版 编辑:程序博客网 时间:2024/06/03 18:56
自己整理了一些基本问题,没有好好整理,日后有问题再补充。
import java.util.Stack;public class LinkList { public Node head;//头结点 public Node current; // 方法1:向链表中添加数据 public void add(int data) { if (head == null) { head = new Node(data); current = head; } else { current.next = new Node(data); current = current.next; } } /*//该方法构造有环链表时用 public void add(Node node){ if(node == null) return; if(head == null){ head = node; current = head; } else{ current.next = head; current = current.next; } }*/ //方法2:遍历链表 public void display(Node node){ if(node == null) return; current = node; while(current != null){ if(current.next == null) System.out.print(current.data+"\n"); else System.out.print(current.data + "->"); current = current.next; } } //方法3:获取单链表的长度 public int getLength(Node head){ if(head == null) return 0; else{ int length=0; Node current = head; while(current != null){ length++; current = current.next; } return length; } } //方法:查找倒数第k个结点 //方法1:遍历 public Node findLastNode(int index){ if(head == null) return null; current = head; int size = 0; while(current != null){ size++; current = current.next; } if(index<1||index>size) return null; current = head; for(int i=0;i<size-index;i++) current = current.next; return current; } //方法2:两个指针遍历 public Node findLastNode(Node head,int index){ if(head == null || index <1) return null; Node first = head; Node second = head; for(int i=0;i<index-1;i++){ first = first.next; if(first == null) return null; } while(first.next != null){ first = first.next; second = second.next; } return second; } //寻找中间节点 public Node findMidNode(Node head){ if(head == null) return null; Node first = head; Node second = head; while(first != null && first.next != null){ first = first.next.next; second = second.next; } return second; } //合并为一个有序递增链表 public Node mergeList(Node head1,Node head2){ if(head1 == null && head2== null) return null; else if(head1 != null && head2 == null) return head2; else if(head1 == null && head2 != null) return head1; else{ Node current1 = head1; Node current2 = head2; Node head ; Node current; if(current1.data<current2.data){ head = current1; current = head; current1 = current1.next; } else{ head = current2; current = head; current2 = current2.next; } while(current1 != null && current2 != null){ if(current1.data<current2.data){ current.next = current1; current = current.next; current1 = current1.next; } else if(current1.data > current2.data){ current.next = current2; current = current.next; current2 = current2.next; } else{ current.next = current1.next; current = current.next; current.next = current2.next; current = current.next; current1 = current1.next; current2 = current2.next; } } if(current1 != null){ current.next = current1; } if(current2 != null){ current.next = current2; } return head; } } //链表反转 public Node reverse(Node head){ if(head == null || head.next == null) return head; Node current = head; Node next = null; Node reverseHead = null; while(current != null){ next = current.next; current.next = reverseHead; reverseHead = current; current = next; } return reverseHead; } //从尾到头打印链表 public void reverseDisplay(Node head){ if(head == null) return; Node current = head; Stack<Node> stack = new Stack<Node>(); while(current != null){ stack.push(current); current = current.next; } for(int i=0; i< stack.size();i++) System.out.print(stack.pop().data + " "); } //递归打印,从尾到头 public void reverseDisplay1(Node head){ if (head == null) return; reverseDisplay1(head.next); System.out.print(head.data+" "); } public boolean hasCycle(Node head){ //如果链表为空,则返回false if(head == null) return false; //first每次移动两步,second每次移动一步 Node first = head; Node second = head; //若链表无环,则必定first先到达链表终点 //循环判定条件:链表结点为奇数,first是否为空;结点为偶数时,first->next是否为空 while(first != null && first.next != null){ first = first.next.next; second = second.next; //若first与second相遇,则代表链表有环 if(first == second) return true; } return false; } //求环中相遇结点 public Node cycleNode(Node head){ //链表为空则返回null if(head == null) return null; Node first = head; Node second = head; while(first != null && first.next != null){ first = first.next.next; second = second.next; //两指针相遇,则返回相遇的结点 if(first == second) return first; } //链表无环,则返回null return null; } public int getCycleLength(Node head){ Node node = cycleNode(head); //node为空则代表链表无环 if(node == null) return 0; int length=1; Node current = node.next; //再次相遇则循环结束 while(current != node){ length++; current = current.next; } return length; } public Node findIntersectNode(Node head1,Node head2){ if(head1 == null || head2 == null) return null; int length1 = getLength(head1); int length2 = getLength(head2); if(length1 > length2){ for(int i=0;i<length1-length2;i++) head1 = head1.next; } if(length1 < length2){ for(int i=0;i<length2-length1;i++) head2 = head2.next; } while(head1!=null && head2!=null){ if(head1 == head2) return head1; head1 = head1.next; head2 = head2.next; } return null; } /*//判断是否有环,有则返回相遇那个节点 public Node hasCycle1(Node head){ if(head == null) return null; Node first = head; Node second = head; while(first != null){ first = first.next.next; second = second.next; if(first == second){ return first; } } return null; } public int getCycleLength(Node head){ Node node = this.hasCycle1(head); if(node == null) return 0; else{ current = node.next; int length = 1; while(current != node){ length++; current = current.next; } return length; } }*/ public Node getCycleStart(Node head){ //获取环的长度 int length = getCycleLength(head); //长度为0 则代表无环 if(length == 0) return null; else{ Node first = head; Node second = head; //让first指针先移动环长度 for(int i=1;i<=length;i++) first = first.next; while(second != first){ first = first.next; second = second.next; } //两者相遇时,为环的入口点 return first; } } public boolean isIntersect(Node head1,Node head2){ if( head1 == null|| head2 == null ) return false; while(head1 != null) head1 = head1.next; while(head2 != null) head2 = head2.next; if(head1 == head2) return true; else return false; } public boolean isIntersectWithCycle(Node head1,Node head2){ //node1和node2保存环上的一点 Node node1 = cycleNode(head1); Node node2 = cycleNode(head2); //如果不存在环上的一点,则代表无环 if(node1 == null || node2 == null) return false; Node current = node1.next; while(current != node1){ //若current与node2相遇,则代表两链表共享一个环即相交 if(current == node2) return true; current = current.next; } return false; } class Node{ int data;//数据域 Node next;//指针域 public Node(int data){ this.data = data; } } public static void main(String[] args){ LinkList linkList = new LinkList(); for(int i=1;i<=100;i++) linkList.add(i); }}
0 0
- 链表基本问题集锦
- LTE基本问题集锦
- C#基本语法&问题集锦
- C#基本语法&问题集锦
- C#基本语法&问题集锦
- C#基本语法问题集锦
- C#基本语法&问题集锦
- 算法——链表问题集锦
- 面试精选:链表问题集锦
- 面试精选:链表问题集锦
- 面试精选:链表问题集锦
- 面试精选:链表问题集锦
- Java面试问题集锦03-Java程序的基本结构
- 问题集锦
- 问题集锦
- 问题集锦
- 问题集锦
- 问题集锦
- SpringMVC学习笔记(七)处理异常
- 正则表达式——学习笔记
- opencv:视频播放
- 蓝桥杯之全排列函数 next_permutation()解析
- String
- 链表基本问题集锦
- 02-源码编译安装测试postgresql 9.6.1(2017-02-07)
- opencv:视频播放控制
- 源码阅读有感
- java服务器线程
- .Net语言 APP开发平台——Smobiler学习日志:如何快速实现手机上的资源上传功能
- 线程及进程间的通信
- opencv:图像变换
- 最大公约数和最小公倍数问题