1.链表反转
/**
* 从头反转链表
*/
private fun reversalNode(head : ListNode) : ListNode{
var head = head
var cur = head.next
head.next = null
while (cur != null) {
var next = cur.next
cur.next = head
head = cur
cur = next
}
return head
}
2.链表反转中间段的节点
/**
* 从中部反转链表
* 即给出一个left <= right,反转left到right的节点
*/
private fun reverseLeftToRight(head : ListNode, left : Int, right : Int) : ListNode{
var index = 0
var curNode = head
var leftPreNode : ListNode = head //这是left节点前的一个节点
while (index < left - 1) {
if (curNode.next != null) {
leftPreNode = curNode
curNode = curNode.next!!
index ++
}
}
var pre = curNode
var newHead = curNode //这是为了后面链接需要
curNode = curNode.next!!
pre.next = null
index ++
while (index < right) {
//实现反转
var next = curNode.next
curNode.next = pre
pre = curNode
newHead = curNode
curNode = next!!
index ++
}
pre = leftPreNode.next!!
pre.next = curNode.next
leftPreNode.next = newHead
return head;
}
3.合并两个链表
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode cur=list1;
ListNode curv=list2;
ListNode m=new ListNode(