- 单链表的反转:
只能遍历单链表一次,例如原始单链表为:10,20,30,40,则反转后应输出:40,30,20,10;
public Node reverseList(){
//cur表示要反转的节点
Node cur = this.head;
//用来记录原始cur的next域
Node prev = null;
//newHead表示反转后新的表头
Node newHead = null;
while(cur != null){
Node curNext = cur.getNext();
if (curNext == null){
newHead = cur;
}
cur.setNext(prev);
prev = cur;
cur = curNext;
}
return newHead;
}
//打印反转后的单链表
public void display(Node newHead){
Node cur = newHead;
while( cur != null){
System.out.print(cur.getData()+" ");
cur = cur.getNext();
}
System.out.println();
}
-链表的中间节点:
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。例如:输入:[1,2,3,4,5],输出:此列表中的结点 3 ;
public Node middleList(){
Node fast = this.head;
Node slow = this.head;
while((fast.getNext() != null) && (fast.getNext() != null)){
fast = fast.getNext().getNext();
slow = slow.getNext();
}
return slow;
}
- 输入一个链表,输出该链表中倒数第k个结点。(只遍历单链表一边)
public Node findNode(int pos){
//判断当前pos位置是否合法
if ((pos <0) ){
return null;
}
Node fast = this.head;
Node slow = this.head;
for (int i = 0; i < pos-1; i++) {
if (fast.getNext() != null){
fast = fast.getNext();
}
else{
System.out.println("没有该节点!");
return null;
}
}
while(fast.getNext() != null){
fast = fast.getNext();
slow = slow.getNext();
}
return slow;
}
- 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前(注意:分割以后保持原来的数据顺序不变。)
例如:单链表的原始数据:20,50,10,30,60;
分割后(以40为基准):20,10,30,50,60;
思路:把所有数据分割成“2条线段”,一条为小于基准的数据(开始记为be,结束记为be),另一条为大于等于基准的数据(开始记为as,结束记为ae),然后在对这两条线段进行连接即可;
public Node partition(int key){
Node bs = null;
Node be = null;
Node as = null;
Node ae = null;
Node cur = this.head;
while(cur != null){
//此处为小于key值的数据
if (cur.getData() < key){
//判断bs是否为第一次插入
if (bs == null){
bs = cur;
be = bs;
}else {
be.setNext(cur);
be = be.getNext();
}
} else {
if (as == null){
as = cur;
ae = as;
} else {
ae.setNext(cur);
ae = ae.getNext();
}
}
cur = cur.getNext();
}
//判断bs是否为空
if (bs == null){
return as;
}
be.setNext(as);
//判断ae的最后一个数据的next域是否为null
if (as != null){
ae.setNext(null);
}
return bs;
}
public void display(Node newHead){
Node cur = newHead;
while( cur != null){
System.out.print(cur.getData()+" ");
cur = cur.getNext();
}
System.out.println();
}