java实现链表基本操作
来源:互联网 发布:qq资源网软件 编辑:程序博客网 时间:2024/06/01 08:12
在看剑指offer的时候看到有关链表基本操作的考点,想总结一下,基本是参考http://blog.csdn.net/kerryfish/article/details/24043099文章实现的,对于该文章中的方法进行了编写,测试,修改了其中几个问题。源码如下
package cn.com.cnn;import java.util.Stack;public class ListSum { public static class Node { int value; Node next; public Node(int value) { this.next = null; this.value = value; } } public static void main(String[] args) { int[] data1 = {1, 2, 3, 4, 5}; int[] data2 = {3, 4, 5}; ListSum listSum = new ListSum(); Node pHead = listSum.createList(data1); Node merge = listSum.createList(data2); //listSum.printList(pHead); //System.out.println(listSum.reGetKthNode(pHead, 3)); //listSum.printList(listSum.reverseList(pHead)); //listSum.printList(listSum.reverseListRec(pHead)); //listSum.returnMiddNode(pHead); //listSum.reversePrintListRec(pHead); //listSum.reversePrintListStack(pHead); //listSum.printList(listSum.mergeLists(pHead, merge)); //listSum.printList(listSum.deleteNode(pHead, 2)); //listSum.printList(listSum.firstCommonNode(pHead, merge)); } public Node createList(int[] data) { Node pHead = null; Node temp = null; for(int i = 0; i < data.length; i++) { if(i == 0) { pHead = new Node(data[i]); temp = pHead; continue; } temp.next = new Node(data[i]); temp = temp.next; } return pHead; } public static int getListLength(Node pHead) { int length = 0; while(pHead != null) { length++; pHead = pHead.next; } return length; } //利用循环倒置链表 public Node reverseList(Node pHead) { if(pHead == null || pHead.next == null ) { return pHead; } Node pNext = null; Node pPre = null; while(pHead != null) { pNext = pHead.next; pHead.next = pPre; pPre = pHead; pHead = pNext; } return pPre; } //利用迭代倒置链表 public Node reverseListRec(Node pHead) { if(pHead == null || pHead.next == null) { return pHead; } Node pNext = reverseListRec(pHead.next); pHead.next = pNext; pHead = pHead.next; return pNext; } //查找链表中间节点,两个指针一个一次跳两个,一个一次跳一个 public Node returnMiddNode(Node pHead) { if(pHead == null || pHead.next == null) { return pHead; } Node pMidd = pHead; Node temp = pHead; while(temp != null && temp.next != null) { temp = temp.next.next; pMidd = pMidd.next; } System.out.println(pMidd.value); return pMidd; } public int reGetKthNode(Node pHead, int k) { Node p = pHead; if(pHead == null || k <= 0) { return 0; } for(int i = 0; i < k; i++) { p = p.next; } while(p.next != null) { p = p.next; pHead = pHead.next; } return pHead.value; } public void printList(Node pHead) { if(pHead == null) { System.out.println("null"); } while(pHead != null) { System.out.print(pHead.value + ", "); pHead = pHead.next; } } //从尾到头打印单链表,递归 public void reversePrintListRec(Node pHead) { if(pHead == null) { return; } else { reversePrintListRec(pHead.next); System.out.print(pHead.value + " "); } } //从尾到头打印单链表,栈 public void reversePrintListStack(Node pHead) { Stack<Node> nodeStack = new Stack<Node>(); while(pHead != null) { nodeStack.push(pHead); pHead = pHead.next; } while(!nodeStack.empty()) { System.out.print(nodeStack.pop().value + " "); } } //合并两个有序的单链表l1,l2 public Node mergeLists(Node head1, Node head2) { if(head1 == null) { return head2; } else if(head2 == null) { return head1; } Node result = null; Node temp = null; if(head1.value < head2.value) { temp = head1; head1 = head1.next; } else if(head1.value > head2.value) { temp = head2; head2= head2.next; } else { temp = head1; head1 = head1.next; head2 = head2.next; } result = temp; while(head1 != null && head2 != null) { if(head1.value < head2.value) { temp.next =head1; head1 = head1.next; } else if(head1.value > head2.value) { temp.next = head1; head1= head1.next; } else { temp.next = head1; head1 = head1.next; head2 = head2.next; } temp = temp.next; temp.next = null; } if(head1 == null) { temp.next = head2; } if(head2 == null) { temp.next = head1; } return result; } public Node deleteNode(Node pHead, int value) { Node temp = null; if(pHead == null) { return temp; } temp = pHead; if(temp.value == value) { temp = temp.next; pHead = temp; } else { while(temp.next != null && temp.next.value != value) { temp = temp.next; } if(temp.next != null && temp.next.value == value) { temp.next = temp.next.next; } } return pHead; } //求两个链表的第一个公共节点 //如果仅仅判断两根链表是否交叉,直接看两个链表最后一个节点是不是相等就可以了。因为都是单链表 public Node firstCommonNode(Node list1, Node list2) { Node result = null; if(list1 == null || list2 == null) { return result; } int list1Length = getListLength(list1); int list2Length = getListLength(list2); if(list1Length <= list2Length) { for(int i = 0; i < list2Length - list1Length; i++) { list2 = list2.next; } } else { for(int i = 0; i < list1Length - list2Length; i++) { list1 =list1.next; } } while(list1 != null && list2 != null) { if(list1.value == list2.value) { result = list1; result.next = null; break; } else { list1 = list1.next; list2 = list2.next; } } return result; } //给出head,delete指针,O(1)时间复杂度删除delete。将删除节点和下个节点的值置换再删除 public Node deleteNode2(Node pHead, Node delete) { Node result = null; if(delete == null) { return result; } if(delete.next == null) { if(pHead == delete) { return result; } else { Node temp = pHead; while(temp.next != delete) { temp = temp.next; } temp.next = null; return pHead; } } delete.value = delete.next.value; delete.next = delete.next.next; return result; }}
阅读全文
0 0
- 链表基本操作java实现
- JAVA实现链表的基本操作
- Java实现--链表基本操作
- java实现链表基本操作
- java泛型实现链表基本操作
- 链表及其基本操作的JAVA实现。
- Java实现双向链表的基本操作
- java单向链表基本操作简单实现
- JAVA实现hash表的基本操作
- 实现链表基本操作(简单操作)
- java 链表基本操作
- 单链表基本操作java实现
- Java实现单链表基本操作
- 链表的基本操作与拓展操作(Java语言实现)
- 【JAVA】java链表的基本操作
- 链表的基本操作实现
- 链表基本操作的实现
- 链表基本操作的实现
- Array、ArrayList、LinkList之间的区别--面试题
- 【jzoj5359】【NOIP2017提高A组模拟9.12】【Arrays and Palindrome】
- Matlab 数模转换时需要的算法
- 公钥加密-私钥解密(RSA)
- linux下磁盘分区
- java实现链表基本操作
- 常见音频视频格式
- unity中简单全景搭建
- 【洛谷】P1525 关押罪犯
- java复习
- Easyui DataGrid自定义视图和subGrid
- Head first HTML&CSS
- 工厂方法模式(二):抽象工厂模式(单个工厂)
- powx-n