给定一个链表,比如L1--->L2---->L3---->................----->Ln,把链表调整为L1---->Ln----->L2----->Ln-1------>L3----
2013-10-03 11:32
369 查看
给定一个链表,比如L1--->L2---->L3---->................----->Ln,把链表调整为L1---->Ln----->L2----->Ln-1------>L3------>Ln-3...........
要求:
1、间复杂度O(1);
2、节点
class Node
{
int value;
Node next;
}
思路:把链表分为两部分前后两个部分,把后部翻转,然后把后部依次插入前部。
要求:
1、间复杂度O(1);
2、节点
class Node
{
int value;
Node next;
}
思路:把链表分为两部分前后两个部分,把后部翻转,然后把后部依次插入前部。
class Node { public int value; public Node next; public Node(int value, Node next) { this.value = value; this.next = next; } } public class ListNodePosition{ public static void printList(Node head) { while (head != null) { System.out.print(head.value+" "); head = head.next; } System.out.println(); } public static void ChangePosition(Node head) { if (head == null || head.next == null) return; Node tmp = head; int num = 0; while (tmp != null) { tmp = tmp.next; num++; } System.out.println(num); int n = 0; tmp = head; Node pre1=null; Node next1=null; int count; if(num%2!=0)count=num/2+1; else count=num/2; while (n < count) { if(n==(count-1))pre1=tmp; tmp = tmp.next; n++; System.out.println(tmp.value); } pre1.next=null; printList(head); printList(tmp); Node pre =null; Node next=null; while(tmp!=null) { next=tmp.next; tmp.next=pre; pre=tmp; tmp= next; } tmp=pre; next=null; printList(pre); System.out.println(n); pre1=head; for(int i=0;i<num/2;i++) { next1=pre1.next; next=tmp.next; pre1.next=tmp; tmp.next=next1; pre1=next1; tmp=next; } printList(head); } public static void main(String[] argv) { Node node1 = new Node(0, null); Node node2 = new Node(1, null); Node node3 = new Node(2, null); Node node4 = new Node(3, null); Node node5 = new Node(4, null); Node node6 = new Node(5, null); //Node node7 = new Node(6, null); node1.next = node2; node2.next = node3; node3.next = node4; node4.next = node5; node5.next = node6; //node6.next = node7; ChangePosition(node1); } }
相关文章推荐
- 链表系列 - [LeetCode] 链表的交错重排L1,Ln,L2,Ln-1 ....
- 给定一棵二叉树,设计一个算法,创建含有某一深度上所有结点的链表(比如:若一棵树的深度为D,则会创建出D个链表)
- given a single link list (l0, l1, l2, l3,,,ln), and transform it to (l0, ln, l1, ln-2, l2, ln-3)
- 算法22:给定一个排好序的linked list,删除其中所有的重复元素。比如给定1->2->3->3-> 4->4->5,返回1->2->5。给定1->1->1->2->3,返回2->3
- 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。
- 给定单链表L:L0→L1→...→Ln-1→Ln, 重新排序:L0→Ln→L1→Ln-1→L2→Ln-2→...
- 给定一个单链表,从链表返回一个随机节点的值。 每个节点必须具有相同的选择概率。 跟进: 如果这个链表非常大,而且它的长度不为人知呢? 你能解决这个问题,而不使用额外的空间?
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- 编写一个函数,给定一个头指针,要求只遍历一次,将单链表中的元素反转过来
- 【IT笔试面试题整理】给定二叉树,给每层生成一个链表
- hdu6003 Problem Buyer 贪心 给定n个区间,以及m个数,求从n个区间中任意选k个区间,满足m个数都能在k个区间中找到一个包含它的区间,如果一个区间包含了x,那么 该区间不能再去包含另一个数,即k>=m。求最小的k。如果不存在这样的k,输出“IMPOSSIBLE!”。
- 清除行列 请编写一个算法,若N阶方阵中某个元素为0,则将其所在的行与列清零。 给定一个N阶方阵int[][](C++中为vector<vector><int>>)mat和矩阵的阶数n,请返回完成操
- 区间序列 (2,3) (4.2,6) (7,9),判断给定的一个区间与上面哪些区间有交集,比如给定(4,5)则输出(4.2,6)。
- [2014美团网笔试]给定一个单链表和一个整数k,要求每隔k个元素翻转链表
- 给定一个单向链表,目前已经有一个指针,指向某一个节点(记作A),现在要删除这个节点A,如何操作。
- 给定一个单向链表(长度未知),请遍历一次就找到中间的指针,假设该链表存储在只读存储器,不能被修改
- 链表翻转。比如给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5
- LinkLists 删除链表中的一个给定指针的结点 @CareerCup
- 给定一个奇数n,比如n=3,生成1到n平方的数,如1到9,填入九宫格,使得横竖斜的和都相等。
- 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5