20120422更新:
对链表中部分节点进行反转操作,这些节点相隔k个:
0->1->2->3->4->5->6->7->8->9
k=2
8->1->6->3->4->5->2->7->0->9
注意1 3 5 7 9 位置是不变的。
解法:
将链表拆成两部分:
a.0->2->4->6->8
b.1->3->5->7->9
将a部分反转,再将a和b合并
==update end==
public class LinkListReversing {
public static void main(String[] args) {
LinkList list=new LinkList();
int[] a={1,2,3,4,5};
for(int each:a){
list.add(each);
}
list.display();
list.reverse();
list.display();
list.reverseRecursive(list.getFirstNode());
list.display();
}
}
class LinkList{
private Node firstNode;
private int length;
public LinkList(){
clear();
}
public void clear(){
firstNode=null;
length=0;
}
public Node getFirstNode(){
return firstNode;
}
public boolean add(int data){
Node node=new Node(data);
if(isEmpty()){
firstNode=node;
}else{
Node lastNode=getNodeAt(length);
lastNode.next=node;
}
length++;
return true;
}
public boolean isEmpty(){
//return length==0;
//use assert to get more details when error occurs
boolean result;
if(length==0){
assert firstNode==null;
result=true;
}else{
assert firstNode!=null;
result=false;
}
return result;
}
public void reverse(){
if(firstNode==null)return;
Node p=firstNode;//use p to traverse every node
Node previous=null;
while(p.next!=null){
Node q=p.next;// save p.next first because the next sentence changes p.next
p.next=previous;
previous=p;
p=q;
}
p.next=previous;
firstNode=p;//should not be ignored
}
//recursive
public Node reverseRecursive(Node p){
if(p==null)return null;
if(p.next==null){
firstNode=p;
return p;
}
Node q=p.next;
//reverse the remaining nodes,except p
//when recursive returns,you can regard the link as a link that has just two elements: p-->q
//so the last reversing is simple: q.next=p;p.next=null;
Node ph=reverseRecursive(q);
q.next=p;
p.next=null;
System.out.print("("+ph.data+")");//ph.data=1,always
return ph;
}
public void display(){
Node node=firstNode;
while(node!=null){
System.out.print(node.data+" ");
node=node.next;
}
System.out.println();
}
private Node getNodeAt(int position){
Node re=firstNode;
if(!isEmpty()&&position>1&&position<=length){
for(int count=1;count<position;count++){
re=re.next;
}
}
return re;
}
//use inner class
private class Node{
private int data;
private Node next;
private Node(int data){
this.data=data;
next=null;
}
}
}
分享到:
相关推荐
Java实现单向链表反转 Java实现单向链表反转是指将单向链表的顺序颠倒,例如原链表为A->B->C->D->E->F,...我们可以使用递归方式或非递归方式来实现单向链表反转,并且需要注意链表的边界情况和节点的next指针的变化。
接下来,我们可以实现链表反转的迭代和递归版本: ```java // 迭代法 public ListNode reverseList(ListNode head) { ListNode prev = null, current = head; while (current != null) { ListNode nextTemp = ...
- IOC(控制反转)和AOP(面向切面编程)概念。 - Spring Boot快速开发,自动配置简化项目构建。 - Spring MVC处理Web请求,Model-View-Controller架构。 7. **数据库操作** - JDBC基础:连接数据库,执行SQL...
本篇文章将详细介绍如何使用递归和非递归两种方法来实现单向链表的反转。 首先,我们来看非递归的解决方案。非递归方法通常涉及到迭代,通过两个指针,`previousNode` 和 `nextNode`,来追踪和更新链表。初始时,`...
- 关键技术:递归或非递归方式实现。 - **BinaryTreeInorderTraversal** - 描述:实现二叉树的中序遍历。 - 关键技术:递归或非递归方式实现。 - **BinaryTreePostorderTraversal** - 描述:实现二叉树的后序...
以上代码片段展示了如何利用递归实现链表反转。`reverseList`函数接收链表的头节点和一个整数k,表示每次需要反转的段落长度。函数中,首先检查是否满足反转条件,如果不满足,则直接返回原头节点。若满足条件,则...
单链表的翻转是数据结构与算法中的一个经典问题,通常有两种主要的实现方式:递归和非递归。本篇文章将详细介绍这两种方法在Java中的实现。 首先,我们定义了一个`Node`类来表示链表的节点,包含一个整数值`val`和...
- 使用位与运算符(&)和位非运算符(~)来实现。 - 通过移位操作来定位特定的位。 #### 33. 帕斯卡三角 - **知识点**:帕斯卡三角是一个二项式系数构成的三角形,每一行的元素是上一行元素的和。 - **实现方法**...
- **IOC(Inversion of Control,控制反转)**是Spring的核心特性之一,它通过依赖注入(DI)实现对对象创建和管理的控制反转。 - **AOP(Aspect Oriented Programming,面向切面编程)**关注于横切关注点(如日志...
- **栈**:后进先出(LIFO)的数据结构,常用于递归的非递归实现、括号匹配等。 - **队列**:先进先出(FIFO)的数据结构,常用于任务调度、广度优先搜索等。 - **堆**:一种特殊的树形数据结构,满足最大堆或...
本部分文档介绍了在Java编程语言中实现几种常见算法和设计模式的示例代码,包括单例模式的两种实现、二叉排序矩阵中的查找算法、字符串中空格替换为"%20"的算法以及链表反转算法。下面将详细讲解每个知识点: ### ...
- **非递归实现**:使用栈或队列实现遍历。 **习题** 1) **前序遍历二叉树**:实现前序遍历。 2) **中序遍历二叉树**:实现中序遍历。 3) **后序遍历二叉树**:实现后序遍历。 4) **对称二叉树**:判断二叉树是否...
- **链表反转**:实现链表的逆序打印和反转整个链表的结构。 - **检测链表中的环**:检测链表是否包含环,并找出环的起始位置。 - **双链表操作**:包括向已排序的双链表中插入节点和反转双链表。 - **链表排序**:...
这个压缩包文件包含了在Lintcode上用Java和Python语言实现的算法和数据结构的解决方案。接下来,我们将深入探讨这些关键知识点。 1. **Java和Python编程基础** - Java:一种静态类型的、面向对象的编程语言,以其...
在IT行业的面试中,数据结构和...例如,链表的反转、二叉树的遍历、队列的应用于任务调度、栈在解决回溯问题中的应用,以及哈希表在解决查找和映射问题中的优势等。熟练掌握这些知识,将大大提高你在面试中的竞争力。
- **链表**:非连续内存结构,通过指针连接,插入和删除操作快。 - **栈**:后进先出(LIFO)结构,仅在栈顶进行操作。 - **队列**:先进先出(FIFO)结构,支持在队尾插入,队头删除。 - **树**:包括二叉树和...
- **非递归思路**:使用栈模拟递归的过程,通过控制节点的入栈和出栈顺序来实现不同遍历方式。 ### 总结 递归作为一种强大的编程技术,在处理具有自相似性的数据结构时非常有效。本文介绍了递归的基本概念、在树和...